python - 两个数组中相应列表的外积之和 - NumPy

标签 python performance numpy for-loop vectorization

我试图找到 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 的方法来进行填充。

曾经,我们有规则形状的数组作为 xe,最终结果将是简单的 -

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

关于python - 两个数组中相应列表的外积之和 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40613009/

相关文章:

python - 使用 Vader-AttributeError : 'float' object has no attribute 'encode' 进行情感分析

python - 集合理解不适用于 Pydev (Python)

python - 让 python 变得更紧凑,是否会提高它的效率?

r - 提高 for 循环的速度/矢量化,包括样本函数 R

java - 使用数组查找或 if else if 语句哪个更好?

python - 如何以非矢量化方式计算Python中批量图像的平均值?

python - 自定义信号在 PySide 中不起作用

Python:格式化合并的 txt 文件

python - 在 Python 中对一维数据执行移动线性拟合

python - 向量化像素化分配,用于分割蒙版的颜色映射