如何在不改变顺序的情况下转置NumPy数组中的每个子矩阵?
解决方法
你用x.T不符合预期的原因很明确:这个操作是把整个数组做转置,而非针对每个1×3的子矩阵(也就是数组的每一行)单独转置。
要实现「不改变子矩阵顺序,仅转置每个子矩阵」的需求,针对y数组可以用以下两种实用方法:
方法1:给每个子矩阵增加维度(转成3×1)
通过给每个行向量添加新维度,把1×3的子矩阵转换成3×1的列向量,再做矩阵乘法:
import numpy as np x = np.array([[1, 2, 3], [4,5,6], [1, 2, 3]]) y = np.array([[11, 22, 33], [44,55,66], [11, 22, 33]]) # 将y的每个1×3子矩阵转置为3×1 y_transposed = y[:, :, np.newaxis] # 等价于 np.expand_dims(y, axis=2) # 对应子矩阵执行矩阵乘法 Z = x @ y_transposed # 把结果压缩为一维数组(可选操作) Z = Z.squeeze()
运行后Z的结果是array([154, 715, 154]),每个元素对应子矩阵相乘的结果(比如第一个元素是1*11 + 2*22 + 3*33 = 154)。
方法2:直接计算点积(更简洁高效)
1×3矩阵和3×1矩阵的乘法,本质就是两个向量的点积,所以可以直接用元素相乘后求和的方式,跳过维度变换步骤:
Z = np.sum(x * y, axis=1)
这个方法得到的结果和方法1完全一致,代码更简洁。
内容的提问来源于stack exchange,提问作者learning statistics
相关产品推荐
相关产品推荐

