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

如何在Python中通过展平矩阵实现特定多维矩阵乘法?

可行方案及Python实现

完全可以通过展平维度实现等价的矩阵乘法,但关键是要保留batch(128)和通道(3)这两个维度的独立性,只对最后两个参与矩阵乘法的维度进行展平与重组,避免打乱子矩阵的对应关系。

核心逻辑

原操作本质是对每个(128,3)对应的子矩阵,执行(32,49) @ (49,32) = (32,32)的乘法。展平的关键是保证每个batch和通道下的子矩阵只能和对应的另一个矩阵的子矩阵相乘,不能跨组混合。


实现方式(以PyTorch为例)

方法一:合并维度后矩阵乘法,再恢复形状

这是最直观的等价实现,先把batch和通道合并为一个大维度,完成乘法后再拆分回原维度:

import torch

# 生成符合形状的测试张量
A = torch.randn(128, 3, 32, 49)
B = torch.randn(128, 3, 49, 32)

# 合并batch和channel维度
A_flat = A.view(128*3, 32, 49)
B_flat = B.view(128*3, 49, 32)

# 执行批量矩阵乘法
result_flat = torch.bmm(A_flat, B_flat)  # 结果形状:(128*3, 32, 32)

# 恢复原维度
result = result_flat.view(128, 3, 32, 32)

方法二:严格展平为二维后计算(通过维度映射保证对应关系)

如果需要强制将其中一个矩阵展平为二维,可借助维度索引映射实现,用einops库能更清晰地控制维度:

from einops import rearrange, einsum

# 展平A为二维:(128*3*32, 49)
A_2d = rearrange(A, 'b c i k -> (b c i) k')
# 展平B为二维:(128*3*49, 32)
B_2d = rearrange(B, 'b c k j -> (b c k) j')

# 通过维度映射指定对应关系,完成乘法并恢复原形状
result = einsum(A_2d, B_2d, '(b c i) k, (b c k) j -> b c i j', 
                b=128, c=3, i=32, k=49, j=32)

验证等价性

可以对比展平法与原四维乘法的结果是否一致:

# 原四维直接乘法
result_original = torch.matmul(A, B)

# 检查结果是否在浮点误差范围内一致
print(torch.allclose(result, result_original))  # 输出True

NumPy版本适配

如果用NumPy处理数组,逻辑完全一致,只需替换对应API:

  • torch.view → np.reshape
  • torch.bmm → np.matmul
  • torch.allclose → np.allclose

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:55:11