为列中的每个numpy元素运行相应的函数



有没有办法加快通过数组的某些元素调用各种函数的速度?在这里,我们想根据第三列中的函数号为第二列中的每个元素调用一个函数。

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

您可以尝试:

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]]()

为什么不让一个函数具有多个分支?它可以避免字符串格式,如果你不想把所有逻辑都放在一个函数中,你可以让它调用其他函数。你有没有试过,发现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])

注意:如果你真的很担心运行时间,并且某些值更有可能,请确保将它们放得更高,这样在需要检查的情况下就会更少。

最新更新