当第二个元素是向量/数组时,numpy矩阵乘法失败("shapes not aligned")



当我将 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( 也可以工作,使其成为最通用的解决方案。

相关内容

最新更新