【问题标题】:Numpy array broadcasting rulesNumpy 数组广播规则
【发布时间】:2012-06-26 01:12:01
【问题描述】:

我在理解 Numpy 中数组广播的规则时遇到了一些麻烦。

显然,如果您对两个具有相同尺寸和形状的数组执行逐元素乘法,一切都很好。此外,如果将多维数组乘以标量,它也可以工作。这个我明白了。

但是,如果您有两个 不同 形状的 N 维数组,我不清楚广播规则到底是什么。这个documentation/tutorial 解释说:为了广播,一个操作中两个数组的尾随轴的大小必须要么相同,要么其中之一必须是一个。 em>

好的,所以我假设 尾随轴 他们指的是M x N 数组中的N。那么,这意味着如果我尝试将两个具有相同列数的二维数组(矩阵)相乘,它应该可以工作吗?除非它没有......

>>> from numpy import *
>>> A = array([[1,2],[3,4]])
>>> B = array([[2,3],[4,6],[6,9],[8,12]])
>>> print(A)
[[1 2]
 [3 4]]
>>> print(B)
[[ 2  3]
 [ 4  6]
 [ 6  9]
 [ 8 12]]
>>> 
>>> A * B
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

由于AB 都有两列,我原以为这会起作用。所以,我可能在这里误解了“尾轴”一词,以及它如何应用于 N 维数组。

有人可以解释为什么我的示例不起作用,以及“尾随轴”是什么意思吗?

【问题讨论】:

标签: python numpy array-broadcasting


【解决方案1】:

好吧,在链接的文档页面上解释了尾轴的含义。 如果您有两个具有不同维数的数组,例如一个 1x2x3 和另一个 2x3,那么您只比较尾随的公共维度,在本例中为 2x3。但是如果你的两个数组都是二维的,那么它们对应的大小必须相等或者其中一个必须是1。数组大小为1 的维度称为奇异维度,数组可以沿着它们广播。

在您的情况下,您有 2x24x24 != 2 并且 42 都不等于 1,所以这不起作用。

【讨论】:

  • 换句话说,Ashape 应该是 Bshape 的后缀,忽略任何值为 1 (?) 的轴
  • 如果忽略你的意思是“1 等于任何东西”并且shape(A)shape(B) 可以是彼此的后缀,那么可以。
  • 实际上,您可以将任何数组视为大小为...x1x1x1x1x1x1x1x.....xAxBxC 的无限维数组,因此我们有很多前导1s,可以作为其他数组广播。这样你就可以忘记后缀的东西,只要说 1 等于任何东西。
【解决方案2】:

来自http://cs231n.github.io/python-numpy-tutorial/#numpy-broadcasting

同时广播两个数组遵循以下规则:

  1. 如果数组的秩不同,则在较低秩数组的形状前面加上 1,直到两个形状的长度相同。

  2. 如果两个数组在一个维度上具有相同的大小,或者如果其中一个数组在该维度上的大小为 1,则称这两个数组在一个维度上是兼容的。

  3. 如果数组在所有维度上都兼容,则可以一起广播。
  4. 广播后,每个数组的行为就好像它的形状等于两个输入数组形状的元素最大值。
  5. 在一个数组的大小为 1 而另一个数组的大小大于 1 的任何维度中,第一个数组的行为就好像它是沿该维度复制的一样

如果此解释没有意义,请尝试阅读解释from the documentationthis explanation

【讨论】:

    【解决方案3】:

    关于广播,我们应该考虑两点。第一:什么是可能的。第二:有多少可能的事情是由numpy完成的。

    我知道这可能看起来有点混乱,但我会通过一些例子说明清楚。

    让我们从零开始。

    假设我们有两个矩阵。第一个矩阵有三个维度(命名为 A),第二个有五个维度(命名为 B)。 numpy 尝试匹配最后/尾随维度。所以 numpy 不关心 B 的前两个维度。然后 numpy 将这些尾随维度相互比较。并且当且仅当它们相等或其中一个为 1 时,numpy 会说“好的,你们两个匹配”。如果这些条件不满足,numpy 会“抱歉……这不是我的工作!”。

    但我知道您可能会说比较最好以可设计时可以处理的方式进行(4 和 2 / 9 和 3)。您可能会说它可以通过整数复制/广播(示例中为 2/3)。我同意你的看法。这就是我开始讨论的原因是区分什么是可能的和什么是 numpy 的能力。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多