gpt4 book ai didi

python - 矩阵乘法 : Multiply each row of matrix by another 2D matrix in Python

转载 作者:行者123 更新时间:2023-12-02 05:15:47 25 4
gpt4 key购买 nike

我正在尝试从这个矩阵乘法中删除循环(并了解有关一般优化代码的更多信息),并且我认为我需要某种形式的 np.broadcastingnp.einsum ,但在阅读了它们之后,我仍然不确定如何使用它们来解决我的问题。

A = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11,12,13,14,15]])
#A is a 3x5 matrix, such that the shape of A is (3, 5) (and A[0] is (5,))

B = np.array([[1,0,0],
[0,2,0],
[0,0,3]])
#B is a 3x3 (diagonal) matrix, with a shape of (3, 3)

C = np.zeros(5)
for i in range(5):
C[i] = np.linalg.multi_dot([A[:,i].T, B, A[:,i]])

#Each row of matrix math is [1x3]*[3x3]*[3x1] to become a scaler value in each row
#C becomes a [5x1] matrix with a shape of (5,)

我知道我不能单独执行 np.multidot ,因为这会产生 (5,5) 数组。

我还发现了这个:Multiply matrix by each row of another matrix in Numpy ,但我不知道这是否真的和我的问题相同。

最佳答案

In [601]: C
Out[601]: array([436., 534., 644., 766., 900.])

这是einsum的自然现象。我像您一样使用 i 来表示传递结果的索引。 jk 是用于乘积总和的索引。

In [602]: np.einsum('ji,jk,ki->i',A,B,A)
Out[602]: array([436, 534, 644, 766, 900])

它可能也可以通过 mutmul 来完成,尽管它可能需要添加一个维度并随后进行压缩。

使用 diag

dot 方法做了很多不必要的工作。 diag 抛出很多值。

要使用matmul,我们必须将i 维度设置为3d 数组的第一个维度。这就是“被动”带来的结果:

In [603]: A.T[:,None,:]@B@A.T[:,:,None]
Out[603]:
array([[[436]], # (5,1,1) result

[[534]],

[[644]],

[[766]],

[[900]]])
In [604]: (A.T[:,None,:]@B@A.T[:,:,None]).squeeze()
Out[604]: array([436, 534, 644, 766, 900])

或者将额外的维度编入索引:(A.T[:,None,:]@B@A.T[:,:,None])[:,0,0]

关于python - 矩阵乘法 : Multiply each row of matrix by another 2D matrix in Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53676531/

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