2016-11-15 62 views
3

我正在尝试查找numpy矩阵操作,以获得与以下循环代码相同的结果。我相信它会更快,但我错过了一些Python技能来做到这一点。两个数组中对应列表的外积之和 - NumPy

它逐行工作,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.]) 

回答

1

这些是不规则的数组,因为它们有不同长度的列表。因此,即使可能的话,完全矢量化的方法也不是直截了当的。这里有一个在一个循环的理解使用np.einsum -

[np.einsum('i,j->',x[n],e[n]) for n in range(len(x))] 

采样运行 -

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的填充方法。

有一次,我们有规则形状的数组作为xe,最终的结果将是根本 -

np.einsum('ik,il->i',x,e) 
+0

谢谢你的回答。如果通过添加零使列表长度相等,该怎么办?它不会改变我的循环中的结果,也许我可以使用点积,然后按照Dakota Dutko的建议? – Daerken

+0

@Daerken编辑了如何使用规则形状阵列的帖子。一探究竟。 – Divakar

+0

不错:)谢谢! – Daerken