1 致谢
感谢网友“FINTHON”的帮助,
原文链接如下:
https://finthon.com/numpy-broadcast/
2 前言
今天在学习K-means算法~
想用一下NumPy中的广播机制,试了一次总是报错,不知道怎么回事,于是就咨询了一下度娘~
然后看到了“FINTHON”的博文,写的真好呀,通俗易懂~
3 如何判断array运算是否可以使用广播
今天用了几次广播总是报错,后来还是看到“FINTHON”的博文才懂了,
其实判断array运算是否可以使用广播的规则是这样的:
将两个array的维度大小右对齐,然后比较对应维度上的数值,如果数值相等或其中有一个为1或者为空,则能进行广播运算,并且输出的维度大小为取数值较大的维度;否则就不能使用广播机制。
我们来看几个例子,
首先是数组b的维数低于数组a,
数组a大小为(2, 3)
数组b大小为(1,)
首先右对齐:
2 3
1
----------
2 3
所以最后两个数组运算的输出大小为:(2, 3)
再举一个例子,数组a与数组b的维数不同,但是某些维度上的长度为1,
数组a大小为(2, 1, 3)
数组b大小为(4, 1)
首先右对齐:
2 1 3
4 1
----------
2 4 3
所以最后两个数组运算的输出大小为:(2, 4, 3)
再来举一个不能使用广播的例子,
数组a大小为(3, 6)
数组b大小为(1, 2)
首先右对齐:
3 6
1 2
----------
2跟5不匹配,此时就不能使用广播机制
可以看到,虽然这里(1,2)分别是(3,6)的最大公约数,但是仍然无法使用广播。
4 NumPy广播应当支持最大公约数的扩充
我觉得除了维度的长度为1可以扩充之外,当维数为整数倍关系(或最大公约数)时,也应该是可以扩充的,希望NumPy在这一点上可以改进并支持。