gpt4 book ai didi

python - 计算 array1 第 i 行和 array2 第 i 列的乘积 - NumPy

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:45 26 4
gpt4 key购买 nike

我有一个形状为 (N*2) 的矩阵 M1 和另一个矩阵 M2 (2*N) code>,我想得到(N)的结果,每个元素iM1第i行的乘积M2 的第 i 列。我尝试在NumPy中使用dot,但它只能给我矩阵乘法结果,即(N*N),当然,我可以取我想要的对角线,我会想知道是否有更好的方法来做到这一点?

最佳答案

方法#1

您可以使用np.einsum -

np.einsum('ij,ji->i',M1,M2)

说明:

最初的循环解决方案看起来像这样 -

def original_app(M1,M2):
N = M1.shape[0]
out = np.zeros(N)
for i in range(N):
out[i] = M1[i].dot(M2[:,i])
return out

因此,对于每次迭代,我们有:

out[i] = M1[i].dot(M2[:,i])

查看迭代器,我们需要将 M1 的第一个轴与 M2 的第二个轴对齐。同样,由于我们正在执行矩阵乘法,并且根据其定义,将 M1 的第二个轴与 M2 的第一个轴对齐,并且还在每次迭代时对这些元素求和。

当移植到einsum时,保持两个输入之间的轴对齐,以便在为其指定字符串表示法时具有相同的字符串。因此,M1M2 的输入分别为 'ij,ji。丢失 M1 中的第二个字符串后的输出(与该求和减少中 M2 中的第一个字符串相同)应保留为 i 。因此,完整的字符串表示法为:'ij,ji->i',最终解决方案为:np.einsum('ij,ji->i',M1,M2) .

方法#2

M1 中的列数或 M2 中的行数为 2。因此,或者,我们可以只切片,执行逐元素乘法并对它们求和,就像这样 -

M1[:,0]*M2[0] + M1[:,1]*M2[1]
<小时/>

运行时测试

In [431]: # Setup inputs
...: N = 1000
...: M1 = np.random.rand(N,2)
...: M2 = np.random.rand(2,N)
...:

In [432]: np.allclose(original_app(M1,M2),np.einsum('ij,ji->i',M1,M2))
Out[432]: True

In [433]: np.allclose(original_app(M1,M2),M1[:,0]*M2[0] + M1[:,1]*M2[1])
Out[433]: True

In [434]: %timeit original_app(M1,M2)
100 loops, best of 3: 2.09 ms per loop

In [435]: %timeit np.einsum('ij,ji->i',M1,M2)
100000 loops, best of 3: 13 µs per loop

In [436]: %timeit M1[:,0]*M2[0] + M1[:,1]*M2[1]
100000 loops, best of 3: 14.2 µs per loop

大幅加速!

关于python - 计算 array1 第 i 行和 array2 第 i 列的乘积 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com