其他基本用法
广播(Broadcasting)
广播规则解释NumPy如何处理不同维度数组之间的算数运算问题。在一定条件下,维度较小的数组广播为更大的数组,使他们具有相同的维度形状。广播提供了一种向量化数组操作方法,使得循环发生在C而不是Python。广播不会产生没必要的数据复制,通常会使算法运行更加有效。缺点是,广播会使内存的使用效率降低,并影响计算速度。
NumPy运算执行在数组的每个元素基础上。如下所示,两个数组必须有相同的形状。
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = np.array([2.0, 2.0, 2.0])
>>> a * b
array([ 2., 4., 6.])
当数组满足一定的约束时,NumPy的广播规则会降低形状必须相同的约束。广播的一个简单例子就是一个数组与一个数值进行运算。
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([ 2., 4., 6.])
结果与第一个例子b为数组时相同。我们可以认为数值b在与数组a进行算数运算时被拉伸为与数组a相同的形状。数组b中的元素是复制数值b所得。我们通过拉伸来做概念上的类比,NumPy更加有效地利用原始数值而不是复制,使广播尽可能保证内存和计算的效率。
通用广播规则
NumPy在数组运算时会自动对比两个数组的形状。首先对比数组最后一轴的大小,依次向前对比。以下两种情况是兼容可运算的:
1. 形状相同
2. 其中一个维度为1
如果不符合运算条件,则会抛出ValueError: frames are not aligned
异常,表明两个数组的形状不同不能运算。运算结果的数组形状每一维都是输入数组中的最大值。
数组不需要维度数相同。例如,你有一个256x256x3
的三维RGB(颜色)值,你想将图像中的每维值用不同的数值等比例扩展。你可以用一个包含3个值得一维数组乘以图像数组。根据广播规则,对准图像数组最后一轴的大小,显示两者之间是可运算的:
Image (3d array): 256 x 256 x 3
Scale (1d array): 3
Result (3d array): 256 x 256 x 3
在两个数组的两个维度比较时,任何一个为1,则另一个即可计算。可以认为,维度为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
更多例子如下所示:
A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4
A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4
A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5
不能广播的例子:
A (1d array): 3
B (1d array): 4 # 最后一维的元素个数不匹配
A (2d array): 2 x 1
B (3d array): 8 x 4 x 3 # 倒数第二维不匹配
实际应用的例子:
>>> x = np.arange(4)
>>> xx = x.reshape(4,1)
>>> y = np.ones(