numpy数组减法,怎么来的?

时间:2015-10-29 11:36:47

标签: 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],
       [4]])
>>> x-y
array([[ 0,  1,  2,  3],
       [-1,  0,  1,  2],
       [-2, -1,  0,  1],
       [-3, -2, -1,  0]])

2 个答案:

答案 0 :(得分:3)

the documentation for numpy broadcasting -

对此进行了解释
  

一般广播规则

     

在两个数组上运行时,NumPy会逐元素地比较它们的形状。 从尾随维度开始,并向前发展

时兼容两个维度      
      
  1. 他们是平等的,或
  2.   
  3. 其中一个是1
  4.         

    如果不满足这些条件,则抛出ValueError: frames are not aligned异常,表明阵列具有不兼容的形状。 生成的数组的大小是输入数组的每个维度的最大大小。

         

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

(强调我的)

当操作具有形状(4,)数组的形状(4,1)数组时,第一个被广播到(1,4)(因为它从尾随维度开始并向前推进,替换它们1如果该维度没有值,则(4,)变为(1,4)。)然后同时操作它们一起创建一个形状(4,4)的数组。

形状(4,1)不被视为矢量。它是一个二维阵列。

如果xarray([[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 [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,)

这是因为首先它检查两个数组的最后一个维度,一个是4而另一个是2,它们根据规则不匹配,因此它会抛出错误。如果x的形状为(2,1),那就可以了。示例 -

In [84]: y - x.reshape((2,1))
Out[84]:
array([[0, 1, 2, 3],
       [3, 4, 5, 6]])

答案 1 :(得分:1)

  

x(4,)和y(4,1)

的形状有什么区别

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

y是一个二维数组;你需要2个索引来访问它的元素。

  

不能理解为什么x-y是一个矩阵?

这是因为当您减去xy广播时。{/ p>

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]