numpy的阵列广播规则(Numpy array broadcasting rules)

2019-06-25 18:02发布

我有一些麻烦了解为numpy的阵列广播规则。

显然,如果你在相同的尺寸和形状的两个数组进行逐元素相乘,一切都很好。 此外,如果你乘以它的工作原理标多维数组。 这个我明白。

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

好了,所以我假定由联动轴它们指的是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

由于这两个AB两列,我还以为这会工作。 所以,我可能误解的东西在这里对术语“尾轴”,以及如何将其应用于N维数组。

有人可以解释为什么我的例子不工作,什么是“尾轴”是什么意思?

Answer 1:

那么,尾随轴的意思是链接的文档页面进行解释。 如果你有两个数组不同尺寸的数字,说一个1x2x3和其他2x3 ,那么你只比较后常见的尺寸,在这种情况下, 2x3 但是,如果你的两个数组是二维的,那么对应的尺寸必须相等或其中一人必须是1 。 沿着该阵列具有尺寸大小1被称为奇异的,并且阵列可以沿着它们进行广播。

你的情况,你有一个2x24x24 != 2既不42等于1 ,所以这是行不通的。



Answer 2:

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

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

  1. 如果阵列不具有相同的等级,前面加上较低等级阵列的形状以1s直到两个形状具有相同的长度。

  2. 两个阵列被认为是在一个尺寸兼容,如果它们在尺寸相同的尺寸,或者,如果阵列中的一个具有在该维度大小1。

  3. 该阵列可以,如果他们在所有方面兼容播出在一起。
  4. 广播之后,将每个阵列的行为就好像它有形状等于所述的elementwise最大两个输入数组的形状。
  5. 在任何维度,其中一个阵列有尺寸1和其它阵列比1具有尺寸时,所述第一阵列的行为就好像它是沿该维复制

如果这种解释是没有意义的,尝试阅读的解释从文档或这样的解释 。



文章来源: Numpy array broadcasting rules