当我更新到最新版本的numpy时,我的很多代码都中断了,因为现在每次我在矩阵和数组上调用np.dot()
时,它都会返回一个1xn矩阵,而不是简单的数组。
当我尝试将新的向量/数组乘以矩阵时,这会导致我出错
示例
A = np.matrix( [ [4, 1, 0, 0], [1, 5, 1, 0], [0, 1, 6, 1], [1, 0, 1, 4] ] )
x = np.array([0, 0, 0, 0])
print(x)
x1 = np.dot(A, x)
print(x1)
x2 = np.dot(A, x1)
print(x2)
output:
[0 0 0 0]
[[0 0 0 0]]
Traceback (most recent call last):
File "review.py", line 13, in <module>
x2 = np.dot(A, x1)
ValueError: shapes (4,4) and (1,4) not aligned: 4 (dim 1) != 1 (dim 0)
我希望矩阵和向量的点都将返回向量,或者矩阵和1xn矩阵的点将按预期工作。
使用x的转置无法解决此问题,也不能使用A @ x
或A.dot(x)
或np.matmul(A, x)
的任何变体形式
答案 0 :(得分:1)
您的数组:
In [24]: A = np.matrix( [ [4, 1, 0, 0], [1, 5, 1, 0], [0, 1, 6, 1], [1, 0, 1, 4] ] )
...: x = np.array([0, 0, 0, 0])
In [25]: A.shape
Out[25]: (4, 4)
In [26]: x.shape
Out[26]: (4,)
圆点:
In [27]: np.dot(A,x)
Out[27]: matrix([[0, 0, 0, 0]]) # (1,4) shape
我们尝试相同的方法,但是使用ndarray
的{{1}}版本:
A
结果是(4,)形状。那是有道理的:(4,4)点(4,)=>(4,)
In [30]: A.A
Out[30]:
array([[4, 1, 0, 0],
[1, 5, 1, 0],
[0, 1, 6, 1],
[1, 0, 1, 4]])
In [31]: np.dot(A.A, x)
Out[31]: array([0, 0, 0, 0])
进行相同的计算,但返回np.dot(A,x)
。根据定义,它是一个2d数组,因此(4,)扩展为(1,4)。
我没有较旧的版本可以对此进行测试,并且不知道有任何更改。
如果np.matrix
是(4,1)矩阵,则结果(4,4)dot(4,1)=>(4,1):
x