我在理解Numpy中阵列广播的规则时遇到了一些麻烦。
显然,如果你在两个相同尺寸和形状的阵列上进行逐元素乘法,一切都很好。此外,如果您将多维数组乘以标量,它就可以工作。我明白了。
但是如果你有两个不同形状的N维数组,我不清楚我究竟是什么广播规则。这个documentation/tutorial解释了:为了广播,操作中两个数组的尾随轴的大小必须是相同的大小,或者其中一个必须是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维数组。
有人可以解释为什么我的例子不起作用,“尾随轴”是什么意思?
答案 0 :(得分:16)
嗯,尾随轴的含义在链接的文档页面上有说明。
如果您有两个具有不同维度编号的数组,例如一个1x2x3
和其他2x3
,那么您只比较尾随的常见维度,在本例中为2x3
。但是如果你的数组都是二维的,那么它们的相应大小必须相等,或者其中一个必须是1
。数组大小为1
的维度称为单数,并且可以沿着它们广播数组。
在您的情况下,您有一个2x2
和4x2
以及4 != 2
,且4
或2
都不等于1
,所以这并不是'工作。
答案 1 :(得分:1)
来自http://cs231n.github.io/python-numpy-tutorial/#numpy-broadcasting:
将两个数组一起广播会遵循以下规则:
如果数组的秩不同,则将低秩数组的形状加1s,直到两个形状的长度相同。
如果两个数组的尺寸相同,或者其中一个数组的尺寸为1,则称这两个数组在尺寸上是兼容的。
- 如果阵列在各个维度上都兼容,则可以一起广播。
- 广播之后,每个数组的行为就好像它们的形状等于两个输入数组的形状的元素最大值一样。
- 在一个数组的大小为1而另一个数组的大小大于1的任何维度中,第一个数组的行为就像是沿着该维度复制的一样。
如果该解释没有意义,请尝试阅读解释from the documentation或this explanation。