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

在NumPy中实现二维矩阵与三维向量数组的乘法操作

解决d×d矩阵与d×1×n矩阵的批量乘法问题

首先修正你代码里的语法错误:T = np.zeros(shape=(d, d)) 缺少右括号,否则会触发语法报错。

要实现沿第三个轴对每个d×1矩阵执行d×d矩阵乘法,最终得到d×1×n的结果,以下是几种高效的向量化解法:

方法1:使用np.einsum(最直观)

np.einsum可以明确指定维度的收缩逻辑,完美匹配你的需求:

import numpy as np

k = 2
s = 36
d = k + s - 1
n = 1119

T = np.zeros(shape=(d, d))
alpha_filt = np.zeros(shape=(d, 1, n))

# 核心代码
result = np.einsum('ij,jkn->ikn', T, alpha_filt)
# result.shape 为 (d, 1, n),符合预期

解释:'ij,jkn->ikn'表示:

  • T的维度对应i×j(即d×d)
  • alpha_filt的维度对应j×k×n(即d×1×n)
  • 收缩j维度,最终得到i×k×n(即d×1×n)的结果

方法2:使用np.matmul配合维度调整

通过reshape将三维矩阵转为二维,完成乘法后再恢复维度结构:

# 将alpha_filt从(d,1,n)转为(d,n),执行矩阵乘法后转回(d,1,n)
result = (T @ alpha_filt.reshape(d, n)).reshape(d, 1, n)

解释:alpha_filt.reshape(d, n)把每个d×1的列向量拼接成d×n矩阵,T @ ...得到d×n的结果,最后通过reshape恢复为(d,1,n)的三维结构。

方法3:利用广播扩展T的维度

将T扩展为(d,d,1),让numpy自动沿第三个轴广播,完成批量乘法:

result = T[:, :, np.newaxis] @ alpha_filt

解释:T[:, :, np.newaxis]把T从(d,d)转为(d,d,1),和alpha_filt的(d,1,n)做矩阵乘法时,numpy会自动广播,对每个n维度的元素执行d×d × d×1的乘法,最终得到(d,1,n)的结果。

以上方法都比apply_along_axis或apply_over_axes高效,因为它们都是向量化操作,避免了循环带来的性能损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:42:45