Numpy:高效的矩阵计算 A*xj,其中 xj 是 X 中的行 j



所以这个"问题"的背景是我正在尝试优化一个大型的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.dotA分别失去它们的第二个轴。要输入到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

最新更新