如何使用Numpy向量化实现矩阵与另一矩阵逐行的点积运算
问题原因
你直接调用np.dot(a, b)报错的核心原因是:Numpy中对两个二维数组执行np.dot时会按照矩阵乘法规则运算,要求第一个矩阵的列数等于第二个矩阵的行数,你的a形状为(3,2),b形状为(100,2),显然不满足该匹配规则。
向量化解决方案
方案1:矩阵乘法(最简洁)
只需要把b做转置,将形状变为(2, 100),就可以直接用矩阵乘法实现需求:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) b = np.random.randint(1, 10, size=(100, 2)) # 模拟100行的b矩阵 z = a @ b.T # 也可以写为np.dot(a, b.T),@是Python3.5+支持的矩阵乘法运算符
此时输出的z形状为(3, 100),其中z[:, i]就完全等价于np.dot(a, b[i])的结果,和需求完全匹配。
方案2:einsum实现(灵活度更高)
如果后续需要调整维度匹配规则,用np.einsum会更方便,写法如下:
z = np.einsum('ij,kj->ik', a, b)
得到的结果和方案1完全一致。
方案3:广播逐乘求和
也可以通过扩展维度广播计算,再对最后一维求和得到结果:
z = (a[:, np.newaxis] * b).sum(axis=-1)
结果验证
你可以直接取对应位置验证结果是否匹配:
print(np.allclose(z[:, 0], np.dot(a, b[0]))) # 输出True print(np.allclose(z[:, 1], np.dot(a, b[1]))) # 输出True
内容的提问来源于stack exchange,提问作者Ami
相关产品推荐
相关产品推荐

