【发布时间】:2019-06-07 00:11:53
【问题描述】:
我有一个函数,它接受一个二元数组作为输入。现在我有大数据(shape = (360000,2)),并想使用 numpy.apply_along_axis 评估每个点的函数。此线程(numpy np.apply_along_axis function speed up?)中给出的答案之一说 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
【问题讨论】:
-
对于 3 个或更多维度,
apply_along_axis比其他维度上的双嵌套循环更方便,更容易编写。但是只有一个循环并不重要。您的loop_way缺少一个步骤,如果您想要一个公平的比较,一个np.array(result)转换。 -
@hpaulj 是的。我更正了函数。谢谢