8.4.广播
import numpy as np
import copy
Windows 10
Python 3.7.3 @ MSC v.1915 64 bit (AMD64)
Latest build date 2020.03.22
numpy version: 1.18.1
广播规则
当使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算。这要求这两个数组的形状相同。如果这两个数组的形状不同,就通过广播broadcasting进行处理:
-
首先让所有输入数组都向其中维度最高的数组看齐。看齐方式为:在shape属性的左侧插入数字1
- 最后输出数组的shape属性是输入数组的shape属性的各轴上的最大值
-
如果输入数组的某个轴的长度为 1,或者与输出数组的各对应轴的长度相同,该数组能正确广播。否则计算出错
-
当输入数组的某个轴的长度为 1时,沿着此轴运算时都用此轴上的第一组值。
广播规则示意图
The code to produce the figures is part of the AstroML book
与广播相关的函数
-
ny.broadcast_arrays()
:查看广播之后的数组 。 -
np.broadcast_to(array, shape, subok=False)
:将array广播为指定的shape,如果指定的shape不满足广播要求,则报错。 -
ndarray.repeat(repeats, axis=None)
:重复某个轴上的值。repeats为重复次数。axis指定被重复的轴,即沿着哪一轴重复。如果未指定,则将数组展平然后重复。返回的也是一个展平的数组
a = copy.deepcopy(np.arange(10).reshape(5,2))
b = np.arange(5)
c = b[:,None]
d = np.ones((5,3))
a = [[0 1] b = [0 1 2 3 4]
[2 3]
[4 5]
[6 7]
[8 9]]
c = [[0] d = [[1. 1. 1.]
[1] [1. 1. 1.]
[2] [1. 1. 1.]
[3] [1. 1. 1.]
[4]] [1. 1. 1.]]
np.broadcast_arrays(d,c)
[array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]),
array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4]])]
np.broadcast_to(b[:,None], (5,2))
array([[0, 0],
[1, 1],
[2, 2],
[3, 3],
[4, 4]])
a.repeat(3, axis=1)
array([[0, 0, 0, 1, 1, 1],
[2, 2, 2, 3, 3, 3],
[4, 4, 4, 5, 5, 5],
[6, 6, 6, 7, 7, 7],
[8, 8, 8, 9, 9, 9]])