【发布时间】:2020-02-20 16:55:02
【问题描述】:
我正在尝试在另一个库中复制 numpy 行为。我的图书馆缺少的一件事是广播行为。使用 numpy 中的非赋值运算符 documentation stating 可以很好地定义运算符的广播行为:
在对两个数组进行操作时,NumPy 会比较它们的形状 元素方面。它从尾随维度开始,并按其 前进的道路。两个维度兼容时
- 它们是相等的,或者
- 其中一个是 1
a * b 很简单,但是 a *= b 或 a[:] = b 呢? numpy 中的分配似乎遵循一些的广播规则,即:
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
a = a.reshape(3,1,1,3)
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = b.reshape(1,1,3,3)
c = a * b # works!
a *= b # fails, non-broadcastable output operand with shape (1,1,3,3) doesn't match the broadcast shape (3,1,1,3)
a[:] = b #fails, could not broadcast input array from shape (1,1,3,3) into to shape (3,1,1,3)
b[:,:,:] = a[1,0,0,:] # works!
现在,我可以直观地理解一些规则,为什么其中一些作业没有意义。问题是我没有看到任何规则集来管理整个分配的广播。我认为它与输出位置形状匹配有关,尽管对于最后一个工作示例(它们没有),即使该逻辑也失败了。我能找到的最接近的是单个statement in the docs(强调我的):
如前所述,可以使用 单个索引、切片以及索引和掩码数组。价值是 分配给索引数组的形状必须一致(相同的形状 或可广播到索引产生的形状)。例如,它是 允许将常量分配给切片:
这里“广播到形状”的定义是什么?
【问题讨论】:
-
broadcasting不会改变 LHS、a或a[:]的形状/尺寸。如果将规则应用于 RHS 不起作用,则会引发错误。 -
@hpaulj 我们在谈论什么规则?在上面的例子中,a 和 b 对广播都是有效的,从技术上讲是内存兼容的,但不能在广播分配中使用。然而,行分配版本理论上应该有同样的问题,但能够被广播。
标签: python numpy array-broadcasting