我有一个函数,将两个元素的数组作为输入。现在我有大量数据(shape =(360000,2)),并希望通过使用numpy.apply_along_axis评估每个点上的函数。此线程(Windows Socket Error Codes)中给出的答案之一表明numpy.apply_along_axis不是为了速度。我的功能是矢量化的。如何在不使用jit / cython的情况下改善所有数据的演化时间。
我将提供一个示例代码,说明我要做的事情
import numpy as np
import random
def sample(x):
return np.sin(x[0])*np.cos(x[1])
data = np.random.normal(size=600*600*2)
data = data.reshape(600*600,2)
%timeit np.sum(np.apply_along_axis(sample, 1,data)) #using the apply_along_axis
def loop_way(): # using loop
result = []
for i in data:
result += [sample(i)]
return np.sum(result)
%timeit loop_way()
output when using np. apply_along_axis: 1 loop, best of 3: 4.06 s per loop
output for loop_way function: 1 loop, best of 3: 2.41 s per loop
答案 0 :(得分:4)
np.sin
和*
是向量化操作,因此,您可以将它们应用于整个数组:
np.sin(data[:, 0]) * np.cos(data[:, 1])
data[:, 0]
是第一列,data[:, 1]
是第二列。
请注意,这应该非常快:)
这是一个笔记本,可以测试每种方法的速度:notebook。
平均运行时间:
numpy.apply_along_axis
):2.08秒