Python numpy数组减法,为什么?

Python numpy数组减法,为什么?,python,numpy,Python,Numpy,不太明白为什么x-y是矩阵 那么x(4,)和y(4,1)的形状有什么区别,它们不是都被当作向量吗 >>> x = np.array([1,2,3,4]) >>> y = x[:,None] >>> x.shape (4,) >>> y.shape (4, 1) >>> x array([1, 2, 3, 4]) >>> y array([[1], [2], [3

不太明白为什么x-y是矩阵

那么x(4,)和y(4,1)的形状有什么区别,它们不是都被当作向量吗

>>> x = np.array([1,2,3,4])
>>> y = x[:,None]
>>> x.shape
(4,)
>>> y.shape
(4, 1)
>>> x
array([1, 2, 3, 4])
>>> y
array([[1],
       [2],
       [3],
       [4]])
>>> x-y
array([[ 0,  1,  2,  3],
       [-1,  0,  1,  2],
       [-2, -1,  0,  1],
       [-3, -2, -1,  0]])
这在本文中得到了很好的解释-

一般广播规则

在两个阵列上操作时,NumPy会按元素比较它们的形状它从后面的维度开始,然后继续前进。当需要时,两个维度是兼容的

  • 他们是平等的,或者
  • 其中一个是1
  • 如果不满足这些条件,将引发
    ValueError:frames not aligned
    异常,表明数组具有不兼容的形状结果数组的大小是输入数组每个维度上的最大大小。

    数组不需要具有相同数量的维度。例如,如果您有一个256x256x3的RGB值数组,并且希望按不同的值缩放图像中的每种颜色,则可以将图像乘以具有3个值的一维数组。根据广播规则排列这些阵列的后轴尺寸

    (强调矿山)

    当使用形状数组
    (4,1)
    操作形状数组
    (4,1)
    时,第一个数组将被广播到
    (1,4)
    (因为它从后面的维度开始并向前运行,如果该维度没有值,则用
    1
    替换它们,因此
    (4,4)
    变为
    (1,4)
    )然后将它们一起操作,创建一个形状数组
    (4,4)

    并且形状
    (4,1)
    不被视为向量。这是一个二维阵列

    如果
    x
    数组([[1,2,3,4]])
    ,一个形状数组
    (1,4)
    -

    范例-

    In [70]: y
    Out[70]:
    array([[1],
           [2],
           [3],
           [4]])
    
    In [71]: x = np.array([x])
    
    In [72]: x
    Out[72]: array([[1, 2, 3, 4]])
    
    In [73]: x - y
    Out[73]:
    array([[ 0,  1,  2,  3],
           [-1,  0,  1,  2],
           [-2, -1,  0,  1],
           [-3, -2, -1,  0]])
    
    In [84]: y - x.reshape((2,1))
    Out[84]:
    array([[0, 1, 2, 3],
           [3, 4, 5, 6]])
    

    广播总是从最后一个维度开始匹配,因此尝试下面这样的操作会抛出错误-

    In [79]: y = np.array([[1,2,3,4],[5,6,7,8]])
    
    In [80]: y.shape
    Out[80]: (2, 4)
    
    In [81]: x = np.array([1,2])
    
    In [82]: x.shape
    Out[82]: (2,)
    
    In [83]: y - x
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-83-4abb3bd0a148> in <module>()
    ----> 1 y - x
    
    ValueError: operands could not be broadcast together with shapes (2,4) (2,)
    
    x(4,)和y(4,1)的形状有什么区别

    x
    是一个向量;您需要1个索引才能访问它的元素

    y
    是一个二维阵列;您需要2个索引来访问它的元素

    不太明白为什么x-y是矩阵

    这是因为当你减去它们时,
    x
    y
    会被广播

    x-y
    变成:

    [1 2 3 4          [1 1 1 1
    
     1 2 3 4           2 2 2 2
                -     
     1 2 3 4           3 3 3 3
    
     1 2 3 4]          4 4 4 4]