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

如何高效实现NumPy中基于3D数组的按行矩阵乘法?

高效实现N维度上的按行矩阵乘法(NumPy)

你可以用两种高效的无循环方式实现需求,均基于NumPy的向量化操作,能彻底避免Python循环的性能损耗:

方法1:使用np.einsum

einsum可通过下标直接描述张量运算逻辑,完美匹配你的需求。正确写法如下:

import numpy as np

N = 100
M = 10
D = 50
arr1 = np.random.normal(size=(N, M, D))
arr2 = np.random.normal(size=(N, M, D))

# 高效计算
result_einsum = np.einsum('nmd,nmd->ndd', arr1, arr2)

下标含义说明:

  • nmd对应arr1的(N, M, D)维度
  • nmd对应arr2的(N, M, D)维度
  • ndd表示输出维度为(N, D, D),运算逻辑是对每个N维度的元素,将arr1和arr2在M维度上做内积,得到D×D的矩阵。

方法2:使用转置 + 矩阵乘法(@运算符)

先将arr1的维度调整为(N, D, M)(对每个N对应的矩阵做转置),再和原arr2做矩阵乘法,NumPy会自动在N维度上广播执行运算:

result_matmul = arr1.transpose(0, 2, 1) @ arr2

这个操作和你循环里的arr1[i].T @ arr2[i]完全等价,但因为是底层向量化实现,速度远快于Python循环。

验证正确性

可以用np.allclose验证两种方法和原循环结果的一致性:

# 原循环结果
result_loop = []
for i in range(N):
    result_loop.append(arr1[i].T @ arr2[i])
result_loop = np.array(result_loop)

print(np.allclose(result_einsum, result_loop))  # 输出True
print(np.allclose(result_matmul, result_loop))  # 输出True

性能说明

当N取值较大时(比如N=10000),两种向量化方法的速度会比循环快几十甚至上百倍——它们规避了Python循环的解释器开销,直接调用底层优化的C代码执行运算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:30:43