【问题标题】:Numpy dot product of a matrix and an array is a matrix矩阵和数组的numpy点积是矩阵
【发布时间】:2019-10-08 10:48:47
【问题描述】:

当我更新到最新版本的 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 @ xA.dot(x)np.matmul(A, x) 的任何变体也不能解决此问题

【问题讨论】:

标签: numpy python-3.7


【解决方案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 版本的A

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])

结果是 (4,) 形状。这是有道理的:(4,4) dot (4,) => (4,)

np.dot(A,x) 正在执行相同的计算,但返回 np.matrix。根据定义,它是一个二维数组,因此 (4,) 扩展为 (1,4)。

我没有旧版本可以对此进行测试,也不知道有任何变化。

如果x是一个(4,1)矩阵,那么结果是(4,4)dot(4,1)=>(4,1):

In [33]: np.matrix(x)                                                                                    
Out[33]: matrix([[0, 0, 0, 0]])
In [34]: np.dot(A, np.matrix(x).T)                                                                       
Out[34]: 
matrix([[0],
        [0],
        [0],
        [0]])

【讨论】:

  • 感谢您的快速回复!您的解决方案有效。如果它是一个数组,但如果它是一个矩阵,则能够用行向量点一个矩阵似乎是不一致的。我只是要使用 np.array 类而不是 np.matrix
  • 您的x 形状为 (4,) 是一维数组。您可能会将其视为向量或行向量,但这不会改变尺寸或形状。 np.dot 描述了它如何处理一维数组,无论它们是第一个还是第二个。有些人(具有 MATLAB 或线性代数背景)在构思既不是行向量也不是列向量的一维数组时确实存在问题。
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2017-07-20
  • 2017-02-26
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多