假设我有一个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称为广播的一个显着特征.它是使用四个规则完成的,这些规则在配方上有点复杂,但一旦理解就相当直观:
- 所有输入数组都
ndim小于最大的输入数组,ndim其形状前面有1个.- 输出形状的每个维度的大小是该维度中所有输入大小的最大值.
- 如果输入在特定维度中的大小与该维度中的输出大小匹配,或者其值正好为1,则可以在计算中使用该输入.
- 如果输入的形状尺寸为1,则该维度中的第一个数据条目将用于沿该维度的所有计算.换句话说,
ufunc意志的踩踏机械根本不沿着那个维度步进(对于那个维度,步幅将是0).
shape mismatch在三种情况下,操作是可能的(不会导致您提到的错误):
- 阵列都具有完全相同的形状.
- 阵列都具有相同的维数,每个维度的长度是公共长度或1.
- 尺寸太小的阵列可以使其形状前置为长度为1的尺寸以满足属性2.
可以通过上面的链接找到示例.
| 归档时间: |
|
| 查看次数: |
11010 次 |
| 最近记录: |