我们都知道,Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下。
可是大家又会发现,如果让一个数组加1的话,结果时整个数组的结果都会加1,这是什么情况呢?
尝试在右边代码框完成以下操作:
import numpy as np #先导入numpy库
np.random.seed(0)
x = np.array(range(12)).reshape(3,4)
x
x + 1
观察运行后输出的结果:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
其实这就是广播机制:Numpy 可以转换这些形状不同的数组,使它们都具有相同的大小,然后再对它们进行运算。
广播机制的规则有三:
规则1:如果两个数组形状中,比如两个二维数组形状分别为m*n和m*1,,两个数组其中一个维度(第0维度)上的长度相同都是m,在另一个维度(第一维度)上长度不一致,但是其中一个数组在长度不一致的那个维度上的长度是1,则可以补齐。
尝试在右边代码框完成以下操作:
np.ones((3,3))+np.arange(3)
np.ones((3,3))+np.ones((1,3))
np.ones((3,3))+np.ones((3,1))
输出:
array([[1., 2., 3.],
[1., 2., 3.],
[1., 2., 3.]])
array([[2., 2., 2.],
[2., 2., 2.],
[2., 2., 2.]])
array([[2., 2., 2.],
[2., 2., 2.],
[2., 2., 2.]])
规则2:如果两个数组的形状在任何一个维度的维数都不匹配,比如两个二维数组形状分别为m*1和1*n,但两个数组都有其中某个维度的维数为1,则数组的形状会沿着维数为1的维度扩展,以匹配另外一个数组形状。
尝试在右边代码框完成以下操作:
np.arange(3).reshape(3,1)+np.arange(3)
np.ones((1,3))+np.ones((2,1))
输出:
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
array([[2., 2., 2.],
[2., 2., 2.]])
规则3:如果两个数组的形状在任何一个维度的维数上都不匹配并且没有任何一个维度有维数等于1,会广播错误。
运行下面的代码便会报错:
np.ones((3,3))+np.ones((2,3))