【Python】numpy广播broadcast与np.newaxis()函数详解
文章目录
1. 广播 broadcast
广播(broadcast)是Python numpy库中十分常用的功能之一。针对不同形状的数组,依据一定规则进行元素的数学运算,一般是“较小的数据在较大的数组上广播”,以便兼容不同的形状。
计算对象数组形状相同
当计算对象数数组形状相同,不会触发广播功能。
比如下面两个数组进行加法运算:
import numpy as np
a = np.array([[ 4, 7, 9],
[10, 2, 10]])
b = np.array([[ 3, 2, 6],
[ 8, 1, 5]])
a + b
输出结果如下,每个位置对应元素相加:
array([[ 7, 9, 15],
[18, 3, 15]])
计算对象数组形状不同
当计算对象数组形状不同时,则会触发广播功能。
广播应用规则: 输入数组具有相同形状,或者其中一个数组某维度的尺寸为1。
如果不满足该规则,那么会抛出异常:ValueError: operands could not be broadcast together。
相同形状的数组运算上面已经说明,那么什么是“其中一个数组某维度的尺寸为1”?
比如下面两个数组:
>>> a = np.array([[ 4, 7, 9],
... [10, 2, 10],
... [ 1, 4, 8]])
>>> b = np.array([[ 3, 2, 6]])
>>> print(a.shape, b.shape)
(3, 3) (1, 3)
>>> a + b
array([[ 7, 9, 15],
[13, 4, 16],
[ 4, 6, 14]])
可以看到,输出结果等于下面两个数组a和c相加:
>>> c = np.array([[ 3, 2, 6],
... [ 3, 2, 6],
... [ 3, 2, 6]])
>>> a + c
array([[ 7, 9, 15],
[13, 4, 16],
[ 4, 6, 14]])
也就是说,在计算时,将b在第一个维度上(原维度为1)进行了“拉伸”或者说“复制”,然后与a在元素级别相加。
如果b的第一个维度不为1,就会抛出异常:
>>> d = np.array([[ 3, 2, 6],
... [ 1, 4, 7]])