跳转至

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]])