为列中的每个numpy元素运行各自的函数。

问题描述 投票:0回答:2

有没有一种方法可以加快通过数组中某些元素调用各种函数的速度?在这里,我们想根据第3列的函数编号,对第2列的每个元素调用一个函数。

import numpy
a = numpy.array([[12, 0, 0, 0, 0], [0, 1, 4, 1, 0], [2, 8, 2, 0, 0], [6, 3, 5, 1, 0]])

a
[[12  0  0  0  0]
 [ 0  1  4  1  0]
 [ 2  8  2  0  0]
 [ 6  3  5  1  0]]

现在使用的For循环,随着行数的增加,速度变得非常慢。当行数达到数百万行时,就会升级到十几分钟才能完成。

for y in range(1, a.shape[0]+1):
    exec('func{}()'.format(a[y, 2]))

def func4():
    a[y, 1 ] = a[y, 1] + 2

 def func2():
    a[1, 1 ] = a[1, 1] + 1

def func5():
   return
python arrays function numpy
2个回答
0
投票

你可以试试。

my_func=eval('['+",".join(["func{}".format(x) for x in range(1,5+1)])+']')
or
my_func=[func0,func1,func2,func3,func4,func5]

for y in range(1, a.shape[0]+1):
        my_func[a[y, 2]]()

0
投票

为什么不干脆一个函数有多个分支?这样可以避免字符串格式化,如果你不想把所有的逻辑都放在一个函数中,你可以让它调用其他函数。你有没有试过,发现if检查太慢?

这段代码展示了如何通过一个主函数来分解它,它接受两个参数,并运行相应的代码或调用一个子函数。

import numpy as np

a = np.array([[12, 0, 0, 0, 0], [0, 1, 4, 1, 0], [2, 8, 2, 0, 0], [6, 3, 5, 1, 0]])


def main_func(c2_val, c3_val):
    if c3_val == 0:
        print("called with col3 value of 0")
        # code for func you would call i.e.
        a[c3_val, 1] = a[c3_val, 1] + 2
    elif c3_val == 4:  # on if for each possible outcome
        # or have it call another function
        func4()
    # etc


def func4():
    print("called with col3 value of 4")


for row in a:
    print(row)
    main_func(row[1], row[2])

注意:如果你真的担心运行时间,而且某些值的可能性比较大,请确保把它们放在更高的位置,这样需要的if检查就会减少。

© www.soinside.com 2019 - 2024. All rights reserved.