所以这个"问题"的背景是我正在尝试优化一个大型的python项目。我开始对程序进行计时,并注意到几乎 50% 的运行时间都花在类似于下面的计算上:
import numpy as np
# Example
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
X = np.random.multivariate_normal([0,0,0,0],np.eye(4),15000)
# Create a lambda function to use row based
F = lambda x: np.dot(A,x)
# Now calculating the value
answer = np.apply_along_axis(F, 1, X)
print answer.shape
我试图找到一种方法来加快速度,但总是碰壁。这真的是这样做的最佳选择吗?
我们可以在X
上使用np.dot
,A
分别失去它们的第二个轴。要输入到np.dot
中,我们将使用X
作为第一个输入并转置A
将其第二个轴放在前面以用作第二个输入。
因此,我们将得到这样的输出 -
X.dot(A.T)
问题中列出的示例输入的运行时测试 -
In [192]: %timeit np.apply_along_axis(F, 1, X)
1 loops, best of 3: 185 ms per loop
In [193]: %timeit X.dot(A.T)
1000 loops, best of 3: 228 µs per loop
In [194]: np.allclose(np.apply_along_axis(F, 1, X), X.dot(A.T))
Out[194]: True # verified results against original code