使用numpy.apply_along_axis时提高代码速度

时间:2019-06-06 02:33:30

标签: python numpy

我有一个函数,将两个元素的数组作为输入。现在我有大量数据(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

1 个答案:

答案 0 :(得分:4)

np.sin*是向量化操作,因此,您可以将它们应用于整个数组:

np.sin(data[:, 0]) * np.cos(data[:, 1])

data[:, 0]是第一列,data[:, 1]是第二列。

请注意,这应该非常快:)


这是一个笔记本,可以测试每种方法的速度:notebook

平均运行时间:

  • 方法1(使用numpy.apply_along_axis):2.08秒
  • 方法2(将功能循环应用于行):1.14s
  • 方法3(此答案):17.3ms