English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 Array auf das größere Array „broadcasted“, damit sie kompatible Formen haben.
NumPy-Operationen werden normalerweise auf elementarer Ebene zwischen Arrays durchgeführt. In den einfachsten Fällen müssen zwei Arrays eine vollständige gleiche Form 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 in der Berechnung 2 wenn die Formen verschiedener Arrays unterschiedlich sind, wird NumPy automatisch das Broadcasting-Mechanismus aktivieren. 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 der Array b durch Broadcasting mit dem Array a kompatibel gemacht wird.
4x3 einer zweidimensionalen Array mit einer Länge von 3 einer eindimensionalen Array addiert, entspricht der Wiederholung des Arrays b in zwei Dimensionen 4 mal wiederholte Berechnung:
>>> 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)) # Wiederholung der Dimensionen von b >>> print(a + bb) [[ 1 2 3]] [11 12 13]] [21 22 23]] [31 32 33]]
wenn auf beiden Arrays zugegriffen wird, vergleicht NumPy die Formen elementweise. Es beginnt mit der nachfolgenden Größe und entwickelt sich nach vorne. Wenn zwei Größen kompatibel sind
sie sind gleich oder
von denen einer ist1
Wenn diese Bedingungen nicht erfüllt sind, wird die Ausnahme ValueError: operands could not be broadcast together ausgelöst, die anzeigt, dass die Arrays unvereinbare Formen haben. Die Größe des Ergebnisarrays ist entlang jeder Eingangsachse nicht1der Größe.
Array muss nicht die gleiche Anzahl von Dimensionen haben. Zum Beispiel, wenn Sie256x256x3RGB-Wertearray und möchten, dass jede Farbe im Bild einen verschiedenen Wert skaliert, können Sie das Bild mit einem Array multiplizieren, das3eine eindimensionale Wertezahlung. Nachdem die Größe der hinteren Achsen der Arrays gemäß den Broadcasting-Regeln angeordnet ist, wird angezeigt, dass sie kompatibel sind:
Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 3
wenn einer der zu vergleichenden Größen1wird verwendet. Mit anderen Worten, die Größe1Die Größe wird gestreckt oder „kopiert“, um eine andere Größe zu entsprechen. In den folgenden Beispielen haben sowohl der Array A als auch der Array B eine Länge von1Die Achse wird während des Broadcasting-Vorgangs auf eine größere Größe erweitert:
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
Nachfolgend einige Beispiele:
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
Nachfolgend sind Beispiele für nicht verbreitete Formen aufgeführt:
A (1d array): 3 B (1d array): 4 #Schlussdimension stimmt nicht überein A (2d array): 2 x 1 B (3d array): 8 x 4 x 3 #zweite untere 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数组。