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

NumPy 广播

NumPy-Broadcasting wird hauptsächlich angewendet, um Arrays mit verschiedenen Formen während arithmetischer Operationen zu behandeln. Unter dem Einfluss bestimmter Einschränkungen wird das kleinere Zellenmass auf das größere Zellenmass „ausgestrahlt“, um eine kompatible Größe zu haben.
NumPy-Operationen werden normalerweise auf Basis von Elementen zwischen Zellenmassen durchgeführt. In den einfachsten Fällen müssen zwei Zellenmassen vollständig gleiche Formen haben, wie im folgenden Beispiel gezeigt:

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

wenn 2 wenn die Formen verschiedener Zellenmassen unterschiedlich sind, wird NumPy automatisch das Broadcasting-Mechanismus auslösen. Zum Beispiel:

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

Das folgende Bild zeigt, wie die Zellenmasse b durch Broadcasting mit der Zellenmasse a kompatibel gemacht wird.

4x3 eine zweidimensionale Zellenmasse mit einer Länge von 3 eine eindimensionale Zellenmasse addiert, ist äquivalent dazu, die Zellenmasse b in zwei Dimensionen zu wiederholen 4 Wiederverwendung:

 >>> 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)) # wiederhole die Dimensionen von b
 >>> print(a + bb)
 [[ 1 2 3]]
  [11 12 13]]
  [21 22 23]]
  [31 32 33]]

Allgemeine Broadcasting-Regeln

wenn NumPy auf beiden Zellenmassen läuft, vergleicht es ihre Formen elementweise. Es beginnt mit der hinteren Größe und entwickelt sich weiter vorwärts. Wenn zwei Größen kompatibel sind

sie sind gleich oder
von denen einer ist1

Wenn diese Bedingungen nicht erfüllt sind, wird eine ValueError: operands could not be broadcast together - Ausnahme ausgelöst, die anzeigt, dass die Arrays in unvereinbaren Formen sind. Die Größe des Ergebniszellenmasses ist nicht entlang jeder Achse des Eingangs1Größe.

Die Zellenmasse muss nicht die gleiche Anzahl von Dimensionen haben. Zum Beispiel, wenn Sie eine256x256x3RGB-Wert-Zellenmasse und Sie möchten, dass jede Farbe im Bild unterschiedliche Werte skaliert, dann können Sie das Bild mit einem Zellenmasse3eine eindimensionale Zellenmasse mit einem Wert eines Wertes. Nach den Broadcasting-Regeln wird die Größe der hinteren Achsen dieser Arrays angeordnet, was zeigt, dass sie kompatibel sind:

 Bild (3d array): 256 x 256 x 3
 Skalierung (1d array): 3
 Ergebnis (3d array): 256 x 256 x 3

wenn einer der zu vergleichenden Größen1wird eine andere Größe verwendet. Mit anderen Worten, die Größe1die Größe wird gestreckt oder „kopiert“, um eine andere Größe zu entsprechen. In folgendem Beispiel haben die Arrays A und B eine Länge von1die Achse, die während des Ausstrahlungsvorgangs in eine größere Größe erweitert wird:

 A (4d array): 8 x 1 x 6 x 1
 B (3d array): 7 x 1 x 5
 Ergebnis (4d array): 8 x 7 x 6 x 5

Nachfolgend einige Beispiele:

 A (2d array): 5 x 4
 B (1d array): 1
 Ergebnis (2d array): 5 x 4
 A (2d array): 5 x 4
 B (1d array): 4
 Ergebnis (2d array): 5 x 4
 A (3d array): 15 x 3 x 5
 B (3d array): 15 x 1 x 5
 Ergebnis (3d array): 15 x 3 x 5
 A (3d array): 15 x 3 x 5
 B (2d array): 3 x 5
 Ergebnis (3d array): 15 x 3 x 5
 A (3d array): 15 x 3 x 5
 B (2d array): 3 x 1
 Ergebnis (3d array): 15 x 3 x 5

Nachfolgend sind Beispiele für nicht ausgestrahlte Formen aufgeführt:

 A (1d array): 3
 B (1d array): 4 # trailing dimensions do not match
 A (2d array): 2 x 1
 B (3d array): 8 x 4 x 3 #zweiteletze Dimension stimmt nicht überein

实践中广播的一个实例:

 >>> 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数组。