添加具有不同维数的数组

ast*_*rog 10 python numpy

假设我有一个2D Numpy数组:

>>> a = np.random.random((4,6))
Run Code Online (Sandbox Code Playgroud)

我想为每一行添加一维数组:

>>> c = np.random.random((6,))
>>> a + c
Run Code Online (Sandbox Code Playgroud)

这有效.现在,如果我尝试向每列添加一维数组,我会收到一个错误:

>>> b = np.random.random((4,))
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Run Code Online (Sandbox Code Playgroud)

我可以通过使用np.newaxis:

>>> a + b[:,np.newaxis]
Run Code Online (Sandbox Code Playgroud)

哪个确实有效.

什么是形状匹配规则,以避免必须使用np.newaxis?这是numpy形状元组的最后一个元素必须匹配吗?此规则是否也适用于更高维度?例如,以下工作:

>>> a = np.random.random((2,3,4,5))
>>> b = np.random.random((4,5))
>>> a + b
Run Code Online (Sandbox Code Playgroud)

所以我的问题是这是否记录在任何地方,如果它是一个可以依赖的行为,或者是否最好总是使用np.newaxis?

Ant*_*ins 12

这是numpy称为广播的一个显着特征.它是使用四个规则完成的,这些规则在配方上有点复杂,但一旦理解就相当直观:

  1. 所有输入数组都ndim小于最大的输入数组,ndim其形状前面有1个.
  2. 输出形状的每个维度的大小是该维度中所有输入大小的最大值.
  3. 如果输入在特定维度中的大小与该维度中的输出大小匹配,或者其值正好为1,则可以在计算中使用该输入.
  4. 如果输入的形状尺寸为1,则该维度中的第一个数据条目将用于沿该维度的所有计算.换句话说,ufunc意志的踩踏机械根本不沿着那个维度步进(对于那个维度,步幅将是0).

shape mismatch在三种情况下,操作是可能的(不会导致您提到的错误):

  1. 阵列都具有完全相同的形状.
  2. 阵列都具有相同的维数,每个维度的长度是公共长度或1.
  3. 尺寸太小的阵列可以使其形状前置为长度为1的尺寸以满足属性2.

可以通过上面的链接找到示例.