当我将 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) 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.])
因为A
是一个矩阵,Python调用A
的__mul__
方法来计算A*b
,以b
作为它的参数。 也就是说,它调用A.__mul__(b)
. numpymatrix
坚持将所有内容都设为二维矩阵,因此它会在执行矩阵乘法之前将b
转换为matrix
。 当b
转换为 numpy 矩阵时,结果的形状(1, 3)
:
In [248]: b
Out[248]: array([1., 1., 1.])
In [249]: np.matrix(b).shape
Out[249]: (1, 3)
然后__mul__
抱怨形状没有对齐,因为A
具有形状(3, 3)
,而转换后的b
具有形状(1, 3)
。
解决此问题的一种方法是在执行乘法之前确保b
是具有形状(3, 1)
的 2-d:
In [250]: b = ones((3, 1))
In [251]: A * b
Out[251]:
matrix([[1.],
[1.],
[1.]])
但是,从长远来看,最好修改代码以根本不使用matrix
,如 @w-m 所述。
问题源于运算符 '*' 正在执行逐元素乘法而不是您想要的矩阵乘法。在python 3中,这可以使用"@"运算符来完成,正如w-m所建议的那样。但是,在python 2中,您必须使用。
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( 也可以工作,使其成为最通用的解决方案。