Python 当第二个元素是向量/数组时,Numpy矩阵乘法失败(“形状未对齐”)
当我将一个NxN numpy矩阵乘以一个N元素numpy数组时,我得到一个错误,表示形状没有对齐Python 当第二个元素是向量/数组时,Numpy矩阵乘法失败(“形状未对齐”),python,numpy,Python,Numpy,当我将一个NxN numpy矩阵乘以一个N元素numpy数组时,我得到一个错误,表示形状没有对齐 from numpy import matrix,ones,eye A = matrix(eye(3)) b = ones(3) A*b ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0) 同样,转移向量也不能解决这个问题 A*b.T ValueError: shapes (3,3) and (1,3)
from numpy import matrix,ones,eye
A = matrix(eye(3))
b = ones(3)
A*b
ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
同样,转移向量也不能解决这个问题
A*b.T
ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
这是有意义的,因为numpy不区分列向量和行向量,所以b.T等于b
如何执行简单的矩阵向量乘法?(不要使用np.matrix
,而是使用二维数组进行线性代数。)
使用矩阵乘法运算符@
:
In [177]: from numpy import ones,eye
...: A = eye(3)
...: b = ones(3)
...: A @ b
Out[177]: array([1., 1., 1.])
问题产生于这样一个事实,即运算符“*”正在执行元素乘法,而不是您想要的矩阵乘法。在Python3中,这可以使用'@'操作符来完成,正如w-m所建议的那样。但是,在Python2中,必须使用
import numpy as np
result = np.dot(A,b)
“*”运算符将尝试将A的每个元素与b的对应元素相乘。如果这些形状不同,您将看到一个错误
编辑:我误解了OP的问题如果两个对象都是矩阵,则将用于矩阵乘法。然而,np.ones(3)生成一个numpy数组,它不是numpy矩阵对象,因此它不工作,并尝试执行元素级乘法
如果b变成:
b = np.matrix((1,1,1)).T
然后代码就可以工作了。还应该注意的是,即使A和b都是矩阵对象、numpy数组或两者的混合,np.dot(A,b)也可以工作,这使得它成为最通用的解决方案。因为
A
是一个矩阵,Python调用A
的方法来计算A*b
,并将b
作为其参数。也就是说,它调用A.\uu mul\uu(b)
。numpy矩阵
坚持将所有内容都设置为二维矩阵,因此在执行矩阵乘法之前,它会将b
转换为矩阵
。当b
转换为numpy矩阵时,结果具有形状(1,3)
:
然后\uuu mul\uuu
抱怨形状没有对齐,因为A
具有形状(3,3)
,而转换后的b
具有形状(1,3)
解决此问题的一种方法是,在执行乘法之前,确保b
是具有形状(3,1)
的二维:
In [250]: b = ones((3, 1))
In [251]: A * b
Out[251]:
matrix([[1.],
[1.],
[1.]])
不过,从长远来看,最好修改代码,使其完全不使用@w-m提到的matrix
你试过b*A吗?没有,但数学上是A*b!=b*A!在您提供的示例中,A*b是元素乘法。在我的原始代码中,A*b是点积。数组的等价物是A.dot(b)。然而,当你有多个点积时,这会变得很混乱(就像我一样)。4矩阵点积将是A点(B点(C点(B)))。A*B*C*B使用np.matrixAh是的,当然,很抱歉让你分心。编辑了答案。天哪!@operator是新的吗?!我认为执行点积的唯一方法是np.array.dot或np.dot,它们都非常难看!(一定是在书上读到过,这些地方只有两个选择)是的,只有几岁!PEP 465,它是在3.5版的Python中添加的。如果您想创建自己的因子,而不仅仅是眼睛或眼睛,那么您还需要从numpy
导入array
。这对于NP.array是正确的。这里我们讨论的是NP.MATRIX,其中*执行矩阵乘法。抱歉,我误解了,并用正确的答案修改了我的答案。
In [250]: b = ones((3, 1))
In [251]: A * b
Out[251]:
matrix([[1.],
[1.],
[1.]])