You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将(M,N,N)的3D numpy数组与(M,N)的2D数组相乘得到(M,N)数组?

解决方案

你需要对每个批次的矩阵-向量对执行乘法,以下几种方法都可以实现需求:

方法1:利用np.matmul(或@运算符)的广播特性

np.matmul支持广播机制,只需给数组B添加一个末尾维度,让其形状变为(M,N,1),就能和形状为(M,N,N)的A进行广播式矩阵乘法,最后去掉多余维度即可:

import numpy as np

M, N = 4, 3
A = np.ones((M,N,N))
B = np.array([[1,1,1],[1,0,0],[0,0,0],[1,2,3]])

# 添加维度后执行矩阵乘法,再压缩最后一维
result = np.matmul(A, B[..., np.newaxis]).squeeze(-1)
# 或者用@运算符,效果完全一致
# result = (A @ B[..., np.newaxis]).squeeze(-1)

print(result)

输出:

[[3. 3. 3.]
 [1. 1. 1.]
 [0. 0. 0.]
 [6. 6. 6.]]

方法2:使用np.einsum明确指定维度运算

你之前尝试einsum失败应该是维度下标书写错误,正确的下标表达式是"mij,mj->mi",各下标对应:

  • m:批次维度(M)
  • i:矩阵的行维度(第一个N)
  • j:矩阵的列/向量的维度(第二个N)
    通过收缩j维度,得到每个批次下的N维结果:
result = np.einsum('mij,mj->mi', A, B)
print(result)

输出和方法1完全一致。

方法3:利用np.dot结合形状变换

把A展开成(M*N, N)的二维数组,B转置为(N,M),执行点积后再恢复原批次形状:

result = np.dot(A.reshape(-1, N), B.T).reshape(M, N)
print(result)

同样能得到期望的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:09