numpy: effizientes Lesen eines großen Arrays

8

Ich habe eine Binärdatei, die eine dichte n*m -Matrix von 32-Bit-Schwimmern enthält. Was ist der effizienteste Weg, um es in ein Fortran-geordnetes numpy -Array zu lesen?

Die Datei ist mehrere Gigabyte groß. Ich bekomme das Format zu kontrollieren, aber es muss kompakt sein (d. H. Etwa 4*n*m Bytes in der Länge) und muss einfach aus Nicht-Python-Code zu produzieren sein.

edit Es ist zwingend notwendig, dass die Methode direkt eine Fortran-geordnete Matrix erzeugt (aufgrund der Größe der Daten kann ich es mir nicht leisten, eine C-geordnete Matrix zu erstellen und sie dann zu transformieren in eine separate Fortran-bestellte Kopie.)

    
NPE 06.12.2010, 11:36
quelle

2 Antworten

12

NumPy bietet fromfile() zum Lesen von Binärdaten.

> %Vor%

erstellt ein eindimensionales Array mit Ihren Daten. Um es als eine zweidimensionale Fortran-geordnete n x m -Matrix zu erhalten, können Sie es umformen:

%Vor%

[EDIT: Die reshape() kopiert die Daten in diesem Fall (siehe Kommentare). Verwenden Sie

, um dies zu tun ohne zu cpoyen %Vor%

Danke an Joe Kingtion für das Aufzeigen.]

Aber um ehrlich zu sein, wenn Ihre Matrix mehrere Gigabyte hat, würde ich für ein HDF5-Tool wie h5py oder PyTables . Beide Werkzeuge haben FAQ-Einträge, die das Werkzeug mit dem anderen vergleichen. Ich bevorzuge generell h5py, obwohl PyTables häufiger verwendet wird (und die Bereiche beider Projekte unterscheiden sich geringfügig).

HDF5 Dateien können aus den meisten Programmiersprachen geschrieben werden, die in der Datenanalyse verwendet werden. Die Liste der Schnittstellen im verlinkten Wikipedia-Artikel ist nicht vollständig, so gibt es beispielsweise auch eine R-Schnittstelle . Aber ich weiß eigentlich nicht, in welcher Sprache Sie die Daten schreiben wollen ...

    
Sven Marnach 06.12.2010, 12:28
quelle
1

Grundsätzlich speichert Numpy die Arrays als flache Vektoren. Die mehreren Dimensionen sind nur eine Illusion, die durch verschiedene Ansichten und Schritte erzeugt wird, die der Numpy-Iterator verwendet.

Für eine gründliche, aber leicht zu befolgende Erklärung, wie Numpy intern funktioniert, siehe die ausgezeichnete Kapitel 19 auf The Beatiful Code Buch .

Mindestens Numpy array() und reshape() haben ein Argument für C ('C'), Fortran ('F') oder konservierte Reihenfolge ('A'). Siehe auch die Frage Wie man die numpy Array-Reihenfolge zum Fortran-Stil erzwingt?

Ein Beispiel mit der Standard-C-Indizierung ( Zeilenreihenfolge ):

%Vor%

Indizierung mit Fortran-Befehl ( Spalten-Groß-Reihenfolge ):

%Vor%

Die andere Ansicht

Sie können immer auch die andere Art von Ansicht mit dem Parameter T eines Arrays erhalten:

%Vor%

Sie können die Schritte auch manuell festlegen:

%Vor%     
peterhil 27.07.2012 01:39
quelle