无法理解numpy数组的添加

时间:2017-01-15 07:13:32

标签: python arrays python-3.x numpy

我确信这是一个非常基本的问题。但是,即使经过几个教程页面和the official documentation之后,我也无法理解numpy数组中的加法逻辑。请考虑以下示例:

In [5]: a = np.array([1, 2, 3])

In [6]: b = np.array([1, 2, 3, 4])

In [7]: a + b
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-f96fb8f649b6> in <module>()
----> 1 a + b

ValueError: operands could not be broadcast together with shapes (3,) (4,) 

这很好。由于数组具有不同的形状,我们不期望“元素”操作可以保持。现在考虑一下:

In [12]: np.array([1]) + np.array([1, 2, 3, 4])
Out[12]: array([2, 3, 4, 5])

突然间,不同形状似乎没有问题。这对我来说也不像是“元素”操作。即使在以下情况下,这似乎也成立:

In [15]: np.array([[1], [2]]) + np.array([1, 2, 3, 4])
Out[15]: 
array([[2, 3, 4, 5],
       [3, 4, 5, 6]])

我无法理解这些输出和错误背后的逻辑。

2 个答案:

答案 0 :(得分:4)

您正在看numpy在工作中广播。

只有一个元素的numpy数组将被视为标量。因此,您的第二个代码块与1 + np.array([1, 2, 3, 4])相同。 1(或np.array([1]))会广播到向量的形状,因此它的工作方式与np.array([1,1,1,1])类似,因此您可以为其他每个值添加一个。

第三个块中的代码将列向量(第一个维度为1的2D数组)乘以行向量,生成结果的2D数组。每个输入数组都会扩展到另一个的维度,因此array([[1],[2]])每行都会拉伸,因此它的工作方式类似于array([[1,1,1,1], [2,2,2,2]]),而array([1,2,3,4])行会重复变为{{1} }}。然后,逐元素地添加两个2乘4阵列。

答案 1 :(得分:1)

这实际上是一个缩放器加一个数组:

In [12]: np.array([1]) + np.array([1, 2, 3, 4])
Out[12]: array([2, 3, 4, 5])

这是有效的,因为右手操作数是两个单行宽,左手是一行:

In [15]: np.array([[1], [2]]) + np.array([1, 2, 3, 4])
Out[15]: 
array([[2, 3, 4, 5],
       [3, 4, 5, 6]])

这些是通过broadcasting完成的。