猿问

如何使用numpy进行元素明智的矩阵乘法

我有两个 numpy 数组,a 大小(20*3*3)和 b 大小(3*3)。设 a=(a1, a2, ..., a20)。我想像这样计算矩阵乘积元素:c=(c1, c2, ..., c20), ci=bT ai b, i=1~20。如何使用 numpy 有效地做到这一点?


使用 for 循环的慢版本是这样的:


a = np.random.sample((20, 3, 3))

b = np.random.sample((3, 3))

c = np.zeros_like(a)

for i0, ai in enumerate(a):

    c[i0] = np.dot(b.T, np.dot(ai, b))


繁星点点滴滴
浏览 192回答 2
2回答

守着星空守着你

您可以将操作置于矢量化形式中,因为您的输入是 NumPy 数组。不需要显式for循环和索引。PS:感谢@yatu 发现答案形状不一样。现在我添加了swapaxes以获得一致的答案作为 OP 的方法np.random.seed(1)a = np.random.sample((4, 3, 3))b = np.random.sample((3, 3))c = np.dot(b.T, np.dot(a, b)).swapaxes(0,1)print (c)[[[0.96496962 1.30807122 0.55382266]  [1.42300972 1.98975139 0.81871374]  [0.32358338 0.45493059 0.1346777 ]] [[1.46772447 2.15650254 0.87555186]  [2.26335921 3.33689922 1.28679305]  [0.71561413 0.96507585 0.54309736]] [[1.50660527 2.36946435 0.59771395]  [2.49705244 3.76328176 1.06274954]  [0.96090846 1.43636151 0.31807679]] [[1.03706878 1.94107476 0.61884642]  [1.74739926 3.07419808 1.03537019]  [0.59565039 1.09721382 0.37283626]]]

富国沪深

你可以试试np.matmul(b.T, np.dot(a,b)):import numpy as npimport pandas as pda = np.random.sample((4, 3, 3))b = np.random.sample((3, 3))c = np.zeros_like(a)# using for loopfor i0, ai in enumerate(a):    c[i0] = np.dot(b.T, np.dot(ai, b))# alternative methode = np.zeros_like(a)e = np.matmul(b.T, np.dot(a,b))# checking for equalprint(np.array_equal(c, e))
随时随地看视频慕课网APP

相关分类

Python
我要回答