【问题标题】:What does it mean for a shape to be "broadcastible" to another in numpy?一个形状在 numpy 中可以“广播”到另一个形状是什么意思?
【发布时间】:2020-02-20 16:55:02
【问题描述】:

我正在尝试在另一个库中复制 numpy 行为。我的图书馆缺少的一件事是广播行为。使用 numpy 中的非赋值运算符 documentation stating 可以很好地定义运算符的广播行为:

在对两个数组进行操作时,NumPy 会比较它们的形状 元素方面。它从尾随维度开始,并按其 前进的道路。两个维度兼容时

  1. 它们是相等的,或者
  2. 其中一个是 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


【解决方案1】:

(1,1,3,3) 变成形状 (3,1,1,3)

b 形状为 (1,1,3,3) 可以广播到 (3,1,3,3) 但不能广播到 (3,1,1,3)。第三个暗淡是3,不能改成1。

在做a*=和a[:]=时,a的形状不会改变。

a[1,0,0,:] 是 (1,1,3),可以广播到 (1,1,1,3) 并继续广播到 (1,1,3,3)。

c = a*b,广播是:

(3,1,1,3) * (1,1,3,3) => (3,1,3,3)

a 的一个暗度增加到 3,b 的另一个暗度也增加到 3。使用二元运算符 *,两个参数都被广播。在分配中,只有 RHS 是。

【讨论】:

  • 那么换句话说,如果你想将b广播到a中,b的每个形状的数字必须是1或等于a的相同维度?或者我真的猜想如果结果广播会导致输出大小发生变化,那么分配广播是无效的?
  • 好的,我从您的编辑中看到,只有一个是广播的,如果它不适合具有广播尺寸的输出,则它是无效的。或者是已经定义了输入和输出形状,并且广播的形状必须与输出形状匹配,否则根据定义会导致索引错误。
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多