Numpy broadcasting规则

Numpy的broadcast操作是为了将两个不同形状的数组,通过一系列规则,变换成形状相同的数组,从而使得它们之间可以进行按元素进行的计算。

Broadcasting的机制并不复杂,只要记住以下几条规则就可以了:

1. 顺序。首先,需要对两个数组的维度进行对其,对齐的顺序是从右向左进行的。也就是说,每个数组的最内侧的维度互相对应,然后依次向外进行匹配。

2. 匹配。两个数组的每一个维度都要匹配。所谓匹配,就是满足下面两个条件之一:

  1. 两个维度的长度相等

  2. 其中一个维度的长度为1

如果两个数组的维度个数不相等,那么维度较少的数组将被扩展到具有相同的维度,新维度的长度均为1。

作为例子,下面两个数组的每个维度都是匹配的

复制代码
A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5

B比A少一个维度,所以在做广播时,它会被扩展出一个长度为1的新维度。

作为反例,下面两个数组是不匹配的

复制代码
A      (2d array):      2 x 1
B      (3d array):  8 x 4 x 3 # second from last dimensions mismatched

可以看到,A的第一个维度和B的第二个维度既不相等,也不为1。

3. 扩展。在进行广播的时候,会将对应维度扩展成同样的长度。因为在匹配检测中已经确保长度要么相同要么其中一个长度是1,所以扩展的过程其实就是将数组在该维度下复制多分,知道两个匹配的维度长度相等。

复制代码
A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5
Result (4d array):  8 x 7 x 6 x 5

4. 结果。如果广播成功,则两个数组的运算结果满足

  1. 维度个数为两个矩阵最多的维度数

  2. 每个维度的长度均为两个数组中对应维度最长的那个

只要记住上面4条原则,就不难理解广播是怎么进行的了。

最后需要指出的是,虽然broadcasting可以减少代码量,使得实现看起来更优雅,但是它也并不是没有代价的。尤其是,在计算过程中产生的中间结果可能会占用大量内存。因此,如果运算的数组规模比较大,那么还是老老实实的用循环好了。

相关推荐
君名余曰正则11 小时前
机器学习实操项目01——Numpy入门(基本操作、数组形状操作、复制与试图、多种索引技巧、线性代数)
线性代数·机器学习·numpy
一车小面包1 天前
人工智能中的线性代数总结--简单篇
人工智能·numpy
__Bolide__8 天前
【不说废话】pytorch张量相对于numpy数组的优势
人工智能·pytorch·numpy
胖祥9 天前
NumPy/PyTorch/C char数组内存排布
c语言·pytorch·numpy
云烟成雨TD9 天前
NumPy 2.x 完全指南【三十二】通用函数(ufunc)之数学运算函数
python·机器学习·numpy
深兰科技9 天前
柳州市委常委、统战部部长,副市长潘展东率队首访深兰科技集团新总部,共探 AI 赋能制造大市与东盟合作新局
人工智能·beautifulsoup·numpy·pyqt·matplotlib·pygame·深兰科技
麻雀无能为力13 天前
python自学笔记14 NumPy 线性代数
笔记·python·numpy
麻雀无能为力13 天前
python 自学笔记13 numpy数组规整
笔记·python·numpy
CodeCraft Studio17 天前
Excel处理控件Aspose.Cells教程:使用Python将 Excel 转换为 NumPy
python·excel·numpy·aspose·数据表格·aspose.cells·excel文档格式转换
R-G-B22 天前
OpenCV Python——Numpy基本操作(Numpy 矩阵操作、Numpy 矩阵的检索与赋值、Numpy 操作ROI)
python·opencv·numpy·numpy基本操作·numpy 矩阵操作·numpy 矩阵的检索与赋值·numpy 操作roi