在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
相关产品推荐
相关产品推荐

