English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NumPy 广播

Le broadcast NumPy est principalement utilisé pour traiter des tableaux de formes différentes pendant les opérations arithmétiques. Sous l'influence de certaines contraintes, les tableaux plus petits sont broadcastés sur les tableaux plus grands pour avoir des formes compatibles.
Les opérations NumPy sont généralement effectuées élément par élément sur les tableaux. Dans le cas le plus simple, deux tableaux doivent avoir la même forme, comme dans l'exemple suivant :

 >>> import numpy as np
 >>> a = np.array([1, 2, 3))
 >>> b = np.array([2, 2, 2))
 >>> a * b
 array([ 2, 4, 6))

Lorsque l'opérateur 2 Lorsque les formes des tableaux sont différentes, numpy déclenche automatiquement le mécanisme de broadcast. Par exemple :

 >>> import numpy as np
 >>> a = np.array([[ 0, 0, 0],
            [10,10,10],
            [20,20,20],
            [30,30,30]])
 >>> b = np.array([1,2,3))
 >>> print(a + b)
 [[ 1 2 3]]
  [11 12 13]]
  [21 22 23]]
  [31 32 33]]

L'image suivante montre comment le tableau b peut être broadcast pour correspondre au tableau a.

4x3 Un tableau bidimensionnel de longueur 3 La somme d'un tableau unidimensionnel est équivalente à la répétition du tableau b en deux dimensions. 4 Opérations en cascade :

 >>> import numpy as np
 >>> a = np.array([[ 0, 0, 0],
            [10,10,10],
            [20,20,20],
            [30,30,30]])
 >>> b = np.array([1,2,3))
 >>> bb = np.tile(b, (4, 1)) #Répéter les dimensions de b
 >>> print(a + bb)
 [[ 1 2 3]]
  [11 12 13]]
  [21 22 23]]
  [31 32 33]]

]]

Les règles de broadcast générales

Lorsque les deux tableaux sont exécutés, NumPy compare leurs formes élément par élément. Il commence par la dimension trailing et continue vers l'avant. Les deux dimensions sont compatibles lorsque
Ils sont égaux, ou1

l'un des deux1Si ces conditions ne sont pas remplies, une exception ValueError: operands could not be broadcast together est levée, indiquant que les tableaux ont des formes incompatibles. La taille du tableau de résultat est le long de chaque axe d'entrée, ce n'est pas

de taille.256x256x3Les tableaux n'ont pas besoin d'avoir le même nombre de dimensions. Par exemple, si vous avez un3Un tableau d'arrays de valeurs RGB, et vous souhaitez que chaque couleur de l'image soit échelonnée avec une valeur différente, vous pouvez multiplier l'image par un tableau avec

 Un tableau unidimensionnel contenant une valeur. Selon les règles de broadcast, les tailles des axes des tableaux suivants sont alignées pour indiquer qu'ils sont compatibles :3d array): 256 x 256 x 3
 Image (1d array): 3
 Result (3d array): 256 x 256 x 3

Scale (1lorsque l'une des dimensions comparées est1Les dimensions sont étirées ou «copiées» pour correspondre à une autre dimension. Dans l'exemple suivant, les tableaux A et B ont tous deux une longueur de1Les axes, qui s'étendent à une plus grande taille pendant l'opération de broadcast :

 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

Voici quelques exemples :

 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

Voici des exemples de formes non broadcastées :

 A (1d array): 3
 B (1d array): 4 #Les dimensions trailing ne correspondent pas
 A (2d array): 2 x 1
 B (3d array): 8 x 4 x 3 #La dernière dimension ne correspond pas

实践中广播的一个实例:

 >>> import numpy as np
 >>> x = np.arange(4)
 >>> xx = x.reshape(4,1)
 >>> y = np.ones(5)
 >>> z = np.ones((3,4))
 >>> x.shape
 (4,)
 y.shape
 (5,)
 >>> x + y
 ValueError: operands could not be broadcast together with shapes (4,) (5,)
 >>> xx.shape
 (4, 1)
 y.shape
 (5,)
 >>> (xx + y).shape
 (4, 5)
 >>> xx + y
 array([[ 1., 1., 1., 1., 1.],
        [ 2., 2., 2., 2., 2.],
        [ 3., 3., 3., 3., 3.],
        [ 4., 4., 4., 4., 4.]])
 >>> x.shape
 (4,)
 >>> z.shape
 (3, 4)
 >>> (x + z).shape
 (3, 4)
 >>> x + z
 array([[ 1., 2., 3., 4.],
        [ 1., 2., 3., 4.],
        [ 1., 2., 3., 4.]])

广播提供了一种方便的方式来获取两个数组的外积(或任何其他外部操作)。以下示例显示了两个1-d数组的外积操作:

 >>> import numpy as np
 >>> a = np.array([0.0, 10.0, 20.0, 30.0])
 >>> b = np.array([1.0, 2.0, 3.0])
 >>> a[:, np.newaxis] + b
 array([[ 1., 2., 3.],
        [ 11., 12., 13.],
        [ 21., 22., 23.],
        [ 31., 32., 33.]])

这里 newaxis索引操作符插入一个新轴 a ,使其成为一个二维 4x1数组。将 4x1数组与形状为 (3,)b组合,产生一个 4x3数组。