Numpy中对应矩阵与向量批量点积实现及np.tensordot报错解决
Numpy 批量对应矩阵向量乘法实现方案
关于 np.tensordot 能否实现需求
你尝试的tensordot写法无法实现需求,而且该方法本身也不适合做这类批量对应位置的矩阵乘法:
- 你第一种写法
axes=([-2,-1],[-2,-1])要求两个数组的收缩轴长度严格匹配,但vectors的倒数第二个轴长度是3、倒数第一个轴长度是1,和matrices最后两个轴的长度(3,3)无法对应,直接触发形状不匹配报错。 - 第二种写法仅指定了matrices的收缩轴,默认取vectors的前两个轴做匹配,同样不符合形状要求。
- 即便硬调整参数实现需求,代码可读性和性能都远不如原生批量运算方法,没有使用必要。
推荐的Numpy原生高效实现
方法1:直接使用@运算符 / np.matmul
这是最简洁的方案,Numpy高维数组使用@运算时,自动将最后两个维度视为矩阵/向量维度,前面的所有维度视为批量维度,要求批量维度形状匹配,正好符合你的需求:
import numpy as np matrices = np.random.rand(4,3,3) vectors = np.random.rand(4,3,1) # 直接批量运算,结果形状为 (4,3,1) result = matrices @ vectors # 等价写法 # result = np.matmul(matrices, vectors)
可以通过以下代码验证和列表推导式结果完全一致:
dot_products = np.array([matrix @ vector for (matrix,vector) in zip(matrices,vectors)]) print(np.allclose(result, dot_products)) # 输出 True
方法2:使用np.einsum显式指定轴运算逻辑
如果需要更灵活的轴匹配规则,可以用einsum显式定义轴的对应和收缩逻辑:
result = np.einsum('ijk,ikl->ijl', matrices, vectors)
其中符号含义:
i:批量维度,对应两个数组的第一个轴,长度为4k:要收缩的公共维度,对应matrices的第三个轴、vectors的第二个轴,长度为3- 运算逻辑为对每个i,对k维度做乘积求和,保留i、j、l三个维度,最终输出形状为(4,3,1),和预期一致。
内容的提问来源于stack exchange,提问作者Gustavo Stahl
相关产品推荐
相关产品推荐

