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

如何在NumPy中实现三维数组内维度的点积向量化运算

向量化实现三维数组内维度的点积计算

问题场景

现有两个三维数组:

  • X:形状为(10, 2, 3),可理解为包含10个2×3的矩阵
  • Y:形状为(8, 1, 3),可理解为包含8个1×3的矩阵

需要计算两者内维度的点积,得到形状为(10, 8, 2)的结果数组Z,已有正确的循环实现,需替换为向量化方案提升运算效率。

原循环实现代码

import numpy as np

X = np.arange(0, 10 * 2 * 3).reshape(10, 2, 3)
Y = np.arange(0, 8 * 1 * 3).reshape(8, 1, 3)

# 初始化结果数组
Z = np.empty((10, 8, 2))
for i, x_i in enumerate(X):
    for j, y_j in enumerate(Y):
        z = x_i @ y_j.T
        # 展平后赋值
        Z[i, j, :] = z[:, 0]

向量化解决方案

这里提供两种高效的向量化实现方式:

方法1:使用np.einsum(直观匹配计算逻辑)

einsum可以清晰描述维度间的运算关系,直接对应需求中的计算逻辑:

Z_vectorized = np.einsum('ijk,lmk->ilm', X, Y)
  • 维度解释:ijk对应X的(10,2,3),lmk对应Y的(8,1,3),指定最后一维(k)做点积,输出维度为ilm即(10,8,2),完全匹配预期结果形状。

方法2:使用np.matmul结合维度扩展

通过扩展维度触发广播机制,实现批量矩阵乘法:

# 扩展维度后做批量矩阵乘法,再去除多余的尾维度
Z_vectorized = (X[:, None] @ Y[:, :, None].transpose(0,2,1)).squeeze(-1)

验证结果一致性

通过以下代码可验证向量化结果与原循环结果完全一致:

print(np.allclose(Z, Z_vectorized))  # 输出True则表示结果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:04