我试图找到 numpy 矩阵运算以获得与以下 for 循环代码相同的结果。我相信它会快得多,但我缺少一些 python 技能来做到这一点。
它逐行工作,x 行的每个值乘以 e 中同一行的每个值,然后求和。
结果的第一项将是 (2*0+2*1+2*4+2*2+2*3)+(0*0+...)+...+(1*0 +1*1+1*4+1*2+1*3)=30
任何想法将不胜感激:)。
e = np.array([[0,1,4,2,3],[2,0,2,3,0,1]])
x = np.array([[2,0,0,0,1],[0,3,0,0,4,0]])
result = np.zeros(len(x))
for key, j in enumerate(x):
for jj in j:
for i in e[key]:
result[key] += jj*i
>>> result
Out[1]: array([ 30., 56.])
最佳答案
那些是参差不齐的数组,因为它们有不同长度的列表。因此,即使可能,完全矢量化的方法也不是直截了当的。这是一个使用 np.einsum
的循环理解-
[np.einsum('i,j->',x[n],e[n]) for n in range(len(x))]
sample 运行-
In [381]: x
Out[381]: array([[2, 0, 0, 0, 1], [0, 3, 0, 0, 4, 0]], dtype=object)
In [382]: e
Out[382]: array([[0, 1, 4, 2, 3], [2, 0, 2, 3, 0, 1]], dtype=object)
In [383]: [np.einsum('i,j->',x[n],e[n]) for n in range(len(x))]
Out[383]: [30, 56]
如果您仍然坚持完全矢量化的方法,您可以制作一个常规数组,其中较小的列表被填充为零。同样,这里有一个 post
其中列出了一种基于 NumPy 的方法来进行填充。
曾经,我们有规则形状的数组作为 x
和 e
,最终结果将是简单的 -
np.einsum('ik,il->i',x,e)
关于python - 两个数组中相应列表的外积之和 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613009/