Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当第二个元素是向量/数组时,Numpy矩阵乘法失败(“形状未对齐”)_Python_Numpy - Fatal编程技术网

Python 当第二个元素是向量/数组时,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)

当我将一个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.])

问题产生于这样一个事实,即运算符“*”正在执行元素乘法,而不是您想要的矩阵乘法。在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.]])