2016-08-11 2 views
3

Ich habe einige 32x32x8192 binäre Datendatei mit einer bestimmten Sequenz und ich frage mich.
Wie kann ich es so in Python 3x. lesen Die Datei besteht aus Nx × Ny × Nz Zahlen (Fließkomma-Einzelpräzision).
Die Reihenfolge der Nummern entspricht indexes x, y and z, die alle nacheinander von 1 to Nx, Ny and Nz ansteigen.
Der am schnellsten variierende Index ist z, gefolgt von y, und der am langsamsten variierende Index ist x.
Das heißt, die ersten Nz Zahlen aus der Folge entsprechen den Indizes x = 1, y = 1 und z, die von 1 to Nz ansteigen.Binärdatei mit spezifischer Sequenz in Python lesen

Eine Probe der Daten durch np.fromfile("turbine_32x32x8192.bin", dtype=float, count=10, sep=""):

[ -8.26325563e+02 -7.41263867e+00 -1.52541103e+01 -1.83999292e+03 
    -7.53629982e+03 -3.43120688e+05 -1.88674962e+04 -1.81482768e+00 
    -4.13878029e+03 -8.29483377e+05] 
+0

In Ordnung. Was hast du dagegen gemacht? Haben Sie ein Paket, das Sie verwenden möchten, zum Beispiel "numpy"? Wissen Sie, wie Sie Dateien in das von Ihnen gewählte Paket einlesen? Hast du versucht es selbst zu implementieren? Wenn die Antwort auf irgendeine dieser Fragen negativ ist, bitte arbeite daran, werde wirklich stecken bleiben und danach fragen. Es ist entmutigend, etwas Neues zu beginnen, aber die Dinge sind ziemlich einfach. – Kartik

+0

Ich habe die Datei gelesen mit: np.fromfile ("turbine_32x32x8192.bin", dtype = float, count = -1, sep = ""). Aber ich möchte ein Format mit 3 Spalten mit Namen Nx, Ny und Nz, vielleicht in einem Pandas-Datenrahmen erstellen. – Damuno

+0

Ok. Wie sind die Daten in Ihrer Datei? Aus Ihrer Frage gehe ich davon aus, dass Sie 'Nx' Anzahl von Dateien mit jeweils' Nz x Ny' Zeilen und Spalten haben. Wenn dies der Fall ist, müssen Sie die Daten in Schleifen lesen und anhängen, wie Sie gehen. Verwenden Sie 'np.zeros ((Nx, Ny, Nz))' als Initialisierungsmatrix. Lesen Sie eine Datei und speichern Sie sie im Array, jeweils 'Nx' in einer Schleife. – Kartik

Antwort

0
import struct 

data = open(filename, 'rb').read() 

def chunk(i, j): 
    at = i * 32 + j 
    return data[at * (8192 * 4) : (at + 1) * (8192 * 4)] 

a = [list(struct.unpack('8192f', chunk(i, j))) for i in range(32) for j in range(32)] 

das Ergebnis wird in a sein.