Python类中numpy矩阵-向量乘法结果异常,求原因分析
问题分析与解决
问题出在乘法逻辑,和Python类的特性无关,具体原因及修正方式如下:
核心问题
- numpy一维数组的转置误区:你传入的
vec = np.array([1, 0.0])是一维数组(shape为(2,)),numpy里一维数组没有行/列的概念,vec.T不会将其转为二维列向量,结果仍然是一维数组。 - 疑似运算符笔误:你得到的
[[1., 0.],[2., 0.]]是逐元素乘法(*)的结果,而非矩阵乘法(@)的结果,大概率是你代码中误将@写成了*。如果代码确实是@,正常情况下self.mat_ @ vec.T应该和直接计算的[1., 2.]一致,不会出现你描述的结果。
修正方案
如果要和直接计算的结果保持一致,直接去掉多余的转置即可:
class Transform: mat_ = np.ones([2, 2], dtype=float) def __init__(self, mat): self.mat_ = mat # vec可以是一维数组或二维列向量 def r_mult(self, vec): return self.mat_ @ vec
如果要严格遵循注释中“vec should be a column vector”的要求,可先将输入转为二维列向量:
class Transform: mat_ = np.ones([2, 2], dtype=float) def __init__(self, mat): self.mat_ = mat # vec should be a column vector(支持传入一维数组自动转换) def r_mult(self, vec): # 将输入转为二维列向量 vec_col = vec.reshape(-1, 1) # 可选:如果需要返回一维数组,可添加.flatten() return self.mat_ @ vec_col
调用修正后的方法,就能得到预期的矩阵-向量乘法结果。
内容的提问来源于stack exchange,提问作者dEmigOd
相关产品推荐
相关产品推荐

