Vektorisierung und Übertragung in Python
Veröffentlicht: 2020-12-01Vektorisierung und Broadcasting sind Möglichkeiten, die Rechenzeit zu beschleunigen und die Speichernutzung zu optimieren, während mathematische Operationen mit Numpy durchgeführt werden. Diese Methoden sind entscheidend, um sicherzustellen, dass die zeitliche Komplexität reduziert wird, damit die Algorithmen keinen Engpässen ausgesetzt sind. Dieser optimierte Betrieb ist notwendig, damit Anwendungen skalierbar sind. Wir werden diese beiden Techniken durchgehen und einige Beispiele implementieren.
Am Ende dieses Tutorials verfügen Sie über folgende Kenntnisse:
- Wie die Vektorisierung von Numpy gehandhabt wird
- Zeitunterschiede mit und ohne Vektorisierung
- Was Rundfunk ist
- Wie Broadcasting sich von der üblichen Matrixmultiplikation unterscheidet
Vektorisierung
Oftmals benötigen wir mathematische Operationen an Arrays – wie Array-Multiplikation. Ein nicht vektorisierter Weg wäre nun, eine elementweise Multiplikation mit einer Schleife durchzuführen. Eine solche Implementierung würde dazu führen, dass dieselbe Multiplikationsoperation mehrmals durchgeführt werden müsste, was eine Verschwendung von Rechenressourcen wäre, wenn die Datengröße zu groß ist. Werfen wir einen kurzen Blick darauf.
Nicht vektorisierter Weg:
Zufällig importieren a = [random.randint( 1 , 100 ) for _ in range( 10000 )] |
#Ausgabe: >> 1000 Schleifen, Best of 3 : 658 µs pro Schleife |
Vektorisierter Weg:
importiere numpy als np a = np.array([random.randint( 1 , 100 ) for _ in range( 10000 )]) b = np.array([random.randint( 1 , 100 ) for _ in range( 10000 )]) %timeit a*b |
#Ausgabe: >> 100000 Schleifen, Best of 3 : 7,25 µs pro Schleife |
Wie wir sehen, ging die verstrichene Zeit von 658 Mikrosekunden auf nur 7,25 Mikrosekunden zurück. Dies liegt daran, dass, wenn wir a = np.array([]) sagen , alle Operationen intern von numpy behandelt werden. Und wenn wir a*b machen, multipliziert numpy intern das komplette Array auf einmal durch Vektorisierung.
Hier verwenden wir den magischen Befehl %timeit, um die Ausführung des Prozesses zu timen, der auf Ihrem Computer unterschiedlich sein kann.
Schauen wir uns ein weiteres Beispiel für äußere Produkte von 2 Vektoren mit den Dimensionen (nx1) und (1xm) an. Die Ausgabe ist (nxm).
Importzeit _ importiere numpy Array importieren a = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) b = array.array( 'i' , [random.randint( 1 , 100 ) for _ in range( 100 )]) |
T1 = time.process_time() c = numpy.zeros(( 200 , 200 )) für i im Bereich(len(a)): für j im Bereich(len(b)): c[i][j]= a[i]*b[j] T2 = time.process_time() print( f”Rechenzeit = { 1000 *(T2-T1)} ms” ) |
#Ausgabe: >> Rechenzeit = 6,819299000000001 ms |
Jetzt machen wir es mit Numpy,
T1 = time.process_time() c = numpy.outer(a, b) T2 = time.process_time() print( f”Rechenzeit = { 1000 *(T2-T1)} ms” ) |
#Ausgabe: >> Rechenzeit = 0,2256630000001536 ms |
Wie wir wieder sehen, verarbeitet Numpy die gleiche Operation durch Vektorisierung viel schneller.
Muss gelesen werden: Faszinierende Python-Anwendungen in der realen Welt
Bisher haben wir also Beispiele gesehen, bei denen Arrays gleicher Größe verwendet wurden. Was ist, wenn die Größen der Arrays unterschiedlich sind? Hier kommt Numpys weiteres großartiges Feature, Broadcasting, ins Bild.
Broadcasting ist eine weitere Erweiterung der Vektorisierung, bei der Arrays nicht die gleiche Größe haben müssen, damit Operationen wie Addition, Subtraktion, Multiplikation usw. an ihnen ausgeführt werden können. Lassen Sie uns dies anhand eines sehr einfachen Beispiels der Addition eines Arrays und eines Skalars verstehen.
a = np.array([ 1 , 1 , 1 , 1 ]) a+ 5 |
#Ausgabe: Array([ 6 , 6 , 6 , 6 ]) |
Wie wir sehen, wurde der Skalar 5 zu allen Elementen hinzugefügt. Wie ist es passiert?
Um sich den Vorgang vorzustellen, können Sie sich vorstellen, dass der Skalar 5 viermal wiederholt wird, um ein Array zu erstellen, das dann dem Array a hinzugefügt wird. Denken Sie jedoch daran, dass Numpy keine solchen Arrays erstellt, die nur Speicher beanspruchen. Numpy „sendet“ oder dupliziert einfach den Skalar 5 bis zu 4 Stellen, um ihn dem Array a hinzuzufügen.

Nehmen wir ein weiteres einfaches Beispiel.
a = np.Einsen(( 3 , 3 )) b = np.Einsen( 3 ) a+b |
#Ausgabe: >> array([[ 2. , 2. , 2. ], [ 2. , 2. , 2. ], [ 2. , 2. , 2. ]]) |
Im obigen Beispiel wurde das Array der Form (3,1) an (3,3) gesendet, um mit Array a übereinzustimmen.
Aber bedeutet dies, dass jedes Array mit einer beliebigen Dimension übertragen werden kann, um mit einem Array mit einer beliebigen Dimension übereinzustimmen?
NEIN!
Rundfunkregeln
Numpy folgt einer Reihe einfacher Regeln, um sicherzustellen, dass nur die Arrays gesendet werden, die den Kriterien entsprechen. Lass uns einen Blick darauf werfen.
Die Rundfunkregel besagt, dass die 2 zu betreibenden Arrays entweder die gleichen Abmessungen haben müssen oder wenn eines von ihnen 1 ist.
Mal sehen, das ist in Aktion.
Beispiel 1:
Betrachten Sie die folgenden Arrays von Dimensionen:
a = 3 x 4 x 7
b = 3 x 4 x 1
Hier wird die letzte Dimension von b übertragen, um der von a bis 7 zu entsprechen.
Also Ergebnis = 3 x 4 x 7
Beispiel 2:
a = 3 x 4 x 7
b = 4
Nun ist die Anzahl der Dimensionen von a und b ungleich. In solchen Fällen wird das Array mit der geringeren Anzahl an Dimensionen mit 1 aufgefüllt.
Hier sind also die erste und letzte Dimension von b 1, also werden sie gesendet, um mit denen von a bis 3 und 7 übereinzustimmen.
Also Ergebnis = 3 x 4 x 7.
Lesen Sie: Python-Tutorial
Beispiel 3:
a = 3 x 4 x 1 x 5
b = 3 x 1 x 7 x 1
Auch hier werden die zweite und letzte Dimension von b übertragen, um mit der von a bis 4 und 5 übereinzustimmen. Außerdem wird die dritte Dimension von a übertragen, um mit der von b bis 7 übereinzustimmen.
Also Ergebnis = 3 x 4 x 7 x 5
Mal sehen, wann die Bedingung fehlschlägt:
Beispiel 4:
a = 3 x 4 x 7 x 5
b = 3 x 3 x 7 x 4
Hier stimmen die zweite und vierte Dimension von b nicht mit a überein und sie sind auch nicht 1. In diesem Fall gibt Python einen Wertfehler aus:
ValueError: Operanden konnten nicht zusammen mit Formen gesendet werden ( 3 , 4 , 7 , 5 ) ( 3 , 3 , 7 , 4 ) |
Beispiel 5:
a = 3 x 4 x 1 x 5
b = 3 x 2 x 3
Ergebnis: ValueError
Auch hier stimmt die zweite Dimension nicht überein und ist für beide nicht 1.
Bevor du gehst
Vektorisierung und Broadcasting sind beides Methoden, mit denen Numpy seine Verarbeitung optimiert und effizienter macht. Diese Konzepte sollten insbesondere im Umgang mit Matrizen und n-dimensionalen Arrays im Auge behalten werden, die in Bilddaten und neuronalen Netzen sehr verbreitet sind.
Wenn Sie neugierig sind, mehr über Python und Data Science zu erfahren, schauen Sie sich das PG Diploma in Data Science von IIIT-B & upGrad an, das für Berufstätige entwickelt wurde und mehr als 10 Fallstudien und Projekte, praktische praktische Workshops, Mentoring mit Branchenexperten, 1-on-1 mit Mentoren aus der Branche, mehr als 400 Stunden Lern- und Jobunterstützung bei Top-Unternehmen.
Was ist Vektorisierung in Python?
Numpy ist ein Python-Paket, das mehrere mathematische Standardfunktionen bereitstellt, die schnelle Operationen mit großen Datenarrays ermöglichen, ohne dass Schleifen erforderlich sind, einschließlich Vektorisierung. Die Vektorisierung wird verwendet, um Python-Programme ohne die Verwendung von Schleifen zu beschleunigen. Die Verwendung eines solchen Verfahrens kann dazu beitragen, die Zeit zu reduzieren, die der Code für die Ausführung benötigt. Es gibt verschiedene Operationen, die an Vektoren ausgeführt werden, wie z. B. Skalarprodukt von Vektoren, auch als Skalarprodukt bekannt, da es eine einzelne Ausgabe erzeugt, äußere Produkte, was zu einer quadratischen Matrix mit einer Dimension gleich der Länge x Länge von führt Vektoren, elementweise Multiplikation, die Elemente mit denselben Indizes erzeugt.
Was ist Broadcasting in Python?
Das Wort Broadcast bezieht sich darauf, wie Numpy Arrays mit unterschiedlichen Dimensionen während arithmetischer Operationen verwaltet, die zu bestimmten Einschränkungen führen; das kleinere Array wird über das enorme Array übertragen, so dass ihre Formen konsistent sind. Mit Broadcasting können Sie Array-Operationen so vektorisieren, dass Schleifen in C und nicht in Python stattfinden, wie es Numpy tut. Dies wird erreicht, ohne unnötige Kopien von Daten zu erstellen, was zu effizienten Algorithmusimplementierungen führt. In bestimmten Situationen ist Broadcasting eine negative Idee, da es zu einem verschwenderischen Speicherverbrauch führt, der die Verarbeitung verlangsamt.
Was sind die Verwendungen von NumPy in Python?
NumPy oder Numerical Python ist eine kostenlose Open-Source-Python-Bibliothek, die von fast allen Forschungs- und Ingenieurzweigen verwendet wird. Die NumPy-Bibliothek enthält mehrdimensionale Array- und Matrix-Datenstrukturen und bietet Methoden zum effizienten Arbeiten mit einem Array, einem homogenen n-dimensionalen Array-Objekt. Benutzer können NumPy verwenden, um eine Vielzahl mathematischer Operationen auf Arrays auszuführen. Es erweitert Python um starke Datenstrukturen, die effiziente Berechnungen mit Arrays und Matrizen ermöglichen, sowie um eine riesige Bibliothek mathematischer Funktionen auf hoher Ebene, die mit diesen Arrays und Matrizen arbeiten.