You need to enable JavaScript to run this app. Numpy中对应矩阵与向量批量点积实现及np.tensordot报错解决
优惠活动
大模型
产品
解决方案
定价
更多

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:批量维度,对应两个数组的第一个轴,长度为4
  • k:要收缩的公共维度,对应matrices的第三个轴、vectors的第二个轴,长度为3
  • 运算逻辑为对每个i,对k维度做乘积求和,保留i、j、l三个维度,最终输出形状为(4,3,1),和预期一致。

内容的提问来源于stack exchange,提问作者Gustavo Stahl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:45:03