NumPy-Broadcasting für effiziente Berechnungen

NumPyNumPyBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Das Broadcasting ist eine leistungsstarke Funktion in NumPy, die es ermöglicht, Arrays mit unterschiedlichen Formen in arithmetischen Operationen zu verwenden. Es bietet einen Weg, Arrayoperationen zu vektorisieren und die Rechenleistung zu verbessern. In diesem Lab werden Sie durch die Grundlagen des Broadcastings in NumPy geführt.

Hinweis: Sie können im 05-broadcasting.ipynb Code schreiben. Einige Druckoperationen werden in den Schritten weggelassen, und Sie können die Ausgabe nach Bedarf drucken.

Das Verständnis von Broadcasting

Das Broadcasting ermöglicht es NumPy, elementweise Operationen auf Arrays mit unterschiedlichen Formen durchzuführen. Das kleinere Array wird automatisch "verbreitet", um der Form des größeren Arrays zu entsprechen. Dies geschieht unter bestimmten Einschränkungen, die wir in den folgenden Schritten untersuchen werden.

Broadcasting mit Arrays der gleichen Form

Im einfachsten Fall müssen zwei Arrays genau die gleiche Form haben, um elementweise Operationen durchzuführen. Beispielsweise:

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
result = a * b

In diesem Fall haben a und b die gleiche Form, sodass die Multiplikation elementweise durchgeführt wird und das Ergebnis [2.0, 4.0, 6.0] ist.

Broadcasting mit einem Skalarwert

Das Broadcasting ermöglicht auch elementweise Operationen zwischen einem Array und einem Skalarwert. Der Skalarwert wird automatisch "ausgedehnt", um der Form des Arrays zu entsprechen. Beispielsweise:

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = 2.0
result = a * b

In diesem Fall ist b ein Skalarwert, wird jedoch ausgedehnt, um ein Array mit der gleichen Form wie a zu werden. Die Multiplikation erfolgt dann elementweise, was zu [2.0, 4.0, 6.0] führt.

Allgemeine Broadcast-Regeln

NumPy vergleicht die Formen zweier Arrays elementweise, um zu bestimmen, ob sie für das Broadcasting kompatibel sind. Die folgenden Regeln gelten:

  1. Zwei Dimensionen sind kompatibel, wenn sie in der Größe gleich sind.
  2. Zwei Dimensionen sind kompatibel, wenn eine von ihnen eine Größe von 1 hat.

Wenn diese Bedingungen nicht erfüllt sind, wird ein ValueError ausgelöst, was darauf hinweist, dass die Arrays inkongruente Formen haben.

Broadcast-Beispiele

Schauen wir uns einige Beispiele an, um zu verstehen, wie das Broadcasting in verschiedenen Szenarien funktioniert.

  • Beispiel 1:
import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 2.0, 3.0])
result = a + b

In diesem Fall wird b zu jeder Zeile von a addiert. Das Ergebnis ist ein 2D-Array mit der gleichen Form wie a, wobei jedes Element die Summe der entsprechenden Elemente in a und b ist.

  • Beispiel 2:
import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 2.0])
result = a + b

In diesem Fall scheitert das Broadcasting, weil die nachfolgenden Dimensionen von a und b nicht gleich sind. Es ist nicht möglich, die Werte in den Zeilen von a mit den Elementen von b für die elementweise Addition auszurichten.

Praktisches Beispiel - Vektorquantisierung

Betrachten wir ein praktisches Beispiel, in dem das Broadcasting nützlich ist. Betrachten Sie den in der Informationstheorie und der Klassifikation verwendeten Vektorquantisierungsalgorithmus (VQ). Die grundlegende Operation bei der VQ besteht darin, den am nächsten gelegenen Punkt in einer Punktmenge zu einem gegebenen Punkt zu finden. Dies kann mit Hilfe von Broadcasting erreicht werden. Hier ist ein Beispiel:

import numpy as np

observation = np.array([111.0, 188.0])
codes = np.array([[102.0, 203.0],
                  [132.0, 193.0],
                  [45.0, 155.0],
                  [57.0, 173.0]])
diff = codes - observation
dist = np.sqrt(np.sum(diff**2, axis=-1))
closest_index = np.argmin(dist)
closest_code = codes[closest_index]

In diesem Beispiel repräsentiert observation das Gewicht und die Größe eines Athleten, der klassifiziert werden soll, und codes repräsentiert verschiedene Klassen von Athleten. Indem man observation von codes subtrahiert, wird das Broadcasting verwendet, um die Entfernung zwischen observation und jedem der Codes zu berechnen. Die argmin-Funktion wird dann verwendet, um den Index des am nächsten gelegenen Codes zu finden.

Zusammenfassung

In diesem Lab haben wir das Broadcasting in NumPy gelernt. Das Broadcasting ermöglicht elementweise Operationen auf Arrays mit unterschiedlichen Formen, was es zu einem leistungsstarken Werkzeug für die Vektorisierung von Array-Operationen und die Verbesserung der Rechenleistung macht. Indem Sie die Broadcast-Regeln verstehen und sie richtig anwenden, können Sie Ihren Code vereinfachen und optimieren.