it-swarm.com.de

Was sind die Vorteile von NumPy gegenüber regulären Python Listen?

Was sind die Vorteile von NumPy gegenüber regulären Python Listen?

Ich habe ungefähr 100 Finanzmarktreihen und werde ein Cube-Array von 100x100x100 = 1 Million Zellen erstellen. Ich werde jedes x mit jedem y und z regressieren (3-variabel), um das Array mit Standardfehlern zu füllen.

Ich habe gehört, dass ich für "große Matrizen" aus Gründen der Leistung und Skalierbarkeit NumPy anstelle von Python -Listen verwenden sollte. Ich kenne Python Listen und sie scheinen für mich zu funktionieren.

Welche Vorteile ergeben sich, wenn ich zu NumPy wechsle?

Was wäre, wenn ich 1000 Serien hätte (dh 1 Milliarde Fließkommazellen im Würfel)?

430
Thomas Browne

NumPys Arrays sind kompakter als Python lists - eine Liste von Listen, wie Sie sie in Python beschreiben, würde mindestens 20 MB benötigen, während ein NumPy 3D-Array mit einfacher Genauigkeit darin schwebt Die Zellen würden in 4 MB passen. Der Zugriff auf das Lesen und Schreiben von Elementen ist mit NumPy ebenfalls schneller.

Vielleicht interessieren Sie sich nicht so sehr für eine Million Zellen, aber definitiv für eine Milliarde Zellen - kein Ansatz würde in eine 32-Bit-Architektur passen, aber mit 64-Bit-Builds würde NumPy mit 4 GB oder so davonkommen , Python alleine würde mindestens 12 GB benötigen (viele Zeiger, deren Größe sich verdoppelt) - ein viel teureres Stück Hardware!

Der Unterschied beruht hauptsächlich auf "Indirektheit" - eine Python Liste ist ein Array von Zeigern auf Python Objekte, mindestens 4 Bytes pro Zeiger plus 16 Bytes für selbst das kleinste Python Objekt (4 für Typzeiger, 4 für Referenzanzahl, 4 für Wert - und die Speicherzuordnungen runden auf 16.) Ein NumPy-Array ist ein Array von einheitlichen Werten - Zahlen mit einfacher Genauigkeit benötigen jeweils 4 Bytes, Zahlen mit doppelter Genauigkeit 8 Bytes. Weniger flexibel, aber Sie zahlen beträchtlich für die Flexibilität von Standard Python Listen!

682
Alex Martelli

NumPy ist nicht nur effizienter. es ist auch bequemer. Sie erhalten kostenlos eine Menge Vektor- und Matrixoperationen, mit denen Sie manchmal unnötige Arbeit vermeiden können. Und sie werden auch effizient umgesetzt.

Sie können Ihren Cube beispielsweise direkt aus einer Datei in ein Array einlesen:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

Summe entlang der zweiten Dimension:

s = x.sum(axis=1)

Finden Sie heraus, welche Zellen über einem Schwellenwert liegen:

(x > 0.5).nonzero()

Entfernen Sie alle geraden Segmente in der dritten Dimension:

x[:, :, ::2]

Viele nützliche Bibliotheken arbeiten auch mit NumPy-Arrays. Zum Beispiel statistische Analyse- und Visualisierungsbibliotheken.

Auch wenn Sie keine Leistungsprobleme haben, lohnt es sich, NumPy zu lernen.

221

Alex erwähnte die Speichereffizienz und Roberto erwähnte die Bequemlichkeit, und beide sind gute Punkte. Für ein paar weitere Ideen erwähne ich Geschwindigkeit und Funktionalität.

Funktionalität: Mit NumPy, FFTs, Convolutions, schneller Suche, grundlegenden Statistiken, linearer Algebra, Histogrammen usw. ist viel integriert. Und wer kann wirklich ohne FFTs leben?

Geschwindigkeit: Hier ist ein Test, bei dem eine Summe über eine Liste und ein NumPy-Array erstellt wird. Dabei wird gezeigt, dass die Summe auf dem NumPy-Array 10-mal schneller ist (in diesem Test kann die Laufleistung variieren).

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

was auf meinen Systemen (während ich ein Backup mache) gibt:

numpy: 3.004e-05
list:  5.363e-04
107
tom10

Hier ist eine nette Antwort von FAQ auf der scipy.org website :

Welche Vorteile bieten NumPy-Arrays gegenüber (verschachtelten) Python -Listen?

Python-Listen sind effiziente Allzweck-Container. Sie unterstützen (ziemlich) effizientes Einfügen, Löschen, Anhängen und Verketten, und das Listenverständnis von Python macht es einfach, sie zu erstellen und zu bearbeiten. Sie haben jedoch bestimmte Einschränkungen: Sie unterstützen keine "vektorisierten" Operationen wie elementweises Addieren und Multiplizieren, und die Tatsache, dass sie Objekte unterschiedlichen Typs enthalten können, bedeutet, dass Python Typinformationen für speichern muss Dies bedeutet auch, dass nur sehr wenige Listenoperationen von effizienten C-Schleifen ausgeführt werden können - jede Iteration würde Typprüfungen und andere Python API-Buchhaltung.

39
Eliezer

Beachten Sie auch, dass Timeseries basierend auf NumPy in den Timeseries-Scikits unterstützt werden:

http://pytseries.sourceforge.net

Für die Regression bin ich ziemlich sicher, dass NumPy selbst für das 100 ^ 3-Problem um Größenordnungen schneller und bequemer als Listen sein wird.

16

Alle haben fast alle Hauptunterschiede zwischen numpy array und python list hervorgehoben, ich werde sie hier kurz erläutern:

  1. Numpy-Arrays haben bei der Erstellung eine feste Größe, im Gegensatz zu python -Listen, die dynamisch wachsen können.) Wenn Sie die Größe von ndarray ändern, wird ein neues Array erstellt und das Original gelöscht.

  2. Die Elemente in einem Numpy-Array müssen alle vom selben Datentyp sein (wir können auch den heterogenen Typ haben, aber das wird Ihnen keine mathematischen Operationen erlauben) und haben daher dieselbe Größe im Speicher

  3. Numpy Arrays ermöglichen mathematische und andere Operationen mit einer großen Anzahl von Daten. Typischerweise werden solche Operationen effizienter und mit weniger Code ausgeführt, als dies mit in Sequenzen eingebauten Pythons möglich ist

4
Parvez Khan