Numpy 数组广播规则

问题描述 投票:0回答:3

我在理解 Numpy 中数组广播的规则时遇到一些困难。

显然,如果对两个具有相同维度和形状的数组执行逐元素乘法,一切都很好。另外,如果将多维数组乘以标量,它就会起作用。这个我明白了。

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

好吧,所以我假设通过 尾随轴,它们指的是

N
数组中的
M 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 维数组。

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

python numpy array-broadcasting
3个回答
22
投票

嗯,尾随轴的含义在链接的文档页面上进行了解释。 如果您有两个具有不同维度数的数组,例如一个

1x2x3
和另一个
2x3
,那么您仅比较尾随的公共维度,在本例中为
2x3
。但是,如果两个数组都是二维的,那么它们相应的大小必须相等,或者其中之一必须为
1
。数组大小为
1
的维度称为奇异维度,数组可以沿着它们进行广播。

在您的情况下,您有

2x2
4x2
4 != 2
,并且
4
2
都不等于
1
,所以这不起作用。


4
投票

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

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

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

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

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

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


0
投票

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

我知道这可能看起来有点令人困惑,但我会通过一些例子来澄清。

让我们从零开始吧。

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

但我知道你可能会说比较最好以可以设计的方式进行比较(4 和 2 / 9 和 3)。你可能会说它可以被整个数字(示例中的 2/3)复制/广播。我同意你的观点。这就是我开始讨论 numpy 的可能性和功能之间的区别的原因。

© www.soinside.com 2019 - 2024. All rights reserved.