Python 广播
当两个数组中每个元素都进行相应的运算的时候,需要两个数组的形状相同,如果形状不同,则使用Python的广播机制进行处理.如下面的例子说明广播是如何操作的.
建立一个二维数组,形状是(6,1):
a = np.arange(0, 60, 10).reshape(-1, 1)
a.shape
# (6, 1)
a
'''
array([[ 0],
[10],
[20],
[30],
[40],
[50]])
'''
建立一个一维数组b,其形状为(5,):
b = np.arange(0, 5)
b
#array([0, 1, 2, 3, 4])
b.shape
#(5,)
进行如下操作:
c = a + b
c
'''
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14],
[20, 21, 22, 23, 24],
[30, 31, 32, 33, 34],
[40, 41, 42, 43, 44],
[50, 51, 52, 53, 54]])
'''
c.shape
# (6, 5)
由于a和b的维数不同,首先需要让b的shape属性向a对齐,即将b变为(1,5)
b.shape = 1, 5
b.shape
#(1, 5)
b
#array([[0, 1, 2, 3, 4]])
加法的两个输入数组的属性分别为(6,1)和(1,5),输出数组的各个轴的长度为输入数组各个轴的长度的最大值,则输出数组的属性为(6,5);
首先将b在第0轴上进行复制,a在第1轴上进行复制,如下所示:
b = b.repeat(6, axis=0)
b
'''
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
'''
b.shape
# (6, 5)
a = a.repeat(5, axis=1)
a
'''
array([[ 0, 0, 0, 0, 0],
[10, 10, 10, 10, 10],
[20, 20, 20, 20, 20],
[30, 30, 30, 30, 30],
[40, 40, 40, 40, 40],
[50, 50, 50, 50, 50]])
'''
a.shape
# (6, 5)
#上述a和b可以进行相应的运算
注意:numpy内部不会使用repeat进行数据扩展,这样会占用空间,而是使用内部集成的函数进行.
如ogrid和mgrid函数.
ogrid函数创建广播预算用的数组,mgrid返回的是进行广播后的数组.