26

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

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

但是如果你有两个不同形状的 N 维数组,我不清楚广播规则到底是什么。该文档/教程解释说:为了广播,操作中两个数组的尾轴大小必须相同或其中之一必须是一个。

好的,所以我假设通过尾随轴他们指的NM x 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

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

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

4

3 回答 3

22

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

在你的情况下,你有一个2x2and 4x2and 4 != 2and not 4or 2equals 1,所以这不起作用。

于 2012-06-24T14:25:05.157 回答
4

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

一起广播两个数组遵循以下规则:

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

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

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

如果此解释没有意义,请尝试阅读文档此解释中的解释

于 2019-01-10T21:09:46.440 回答
0

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

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

让我们从零开始。

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

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

于 2021-09-24T07:15:29.043 回答