2012-12-11 4 views
7

Ich schrieb eine Matrix in Fortran wie folgt:wie eine ausgegebene Fortran binäre NxNxN Matrix in Python lesen

real(kind=kind(0.0d0)), dimension(256,256,256) :: dense 

[...CALCULATION...] 

inquire(iolength=reclen)dense 
open(unit=8,file=fname,& 
form='unformatted',access='direct',recl=reclen) 
write(unit=8,rec=1)dense(:,:,:) 
close(unit=8) 

ich diese wieder in Python lesen möchten. Alles, was ich gesehen habe, ist für 2D-NxN-Arrays und nicht für 3D-Arrays. In Matlab kann ich es lesen, wie:

fid = fopen(nfilename,'rb'); 
mesh_raw = fread(fid,ndim*ndim*ndim,'double'); 
fclose(fid); 
mesh_reshape = reshape(mesh_raw,[ndim ndim ndim]); 

ich das Äquivalent in Python nur müssen - vermutlich gibt es eine ähnliche Last/umformen Werkzeug zur Verfügung. Wenn es eine freundlichere, kompaktere Möglichkeit gibt, es für Python zu schreiben, bin ich offen für Vorschläge. Es wird vermutlich etwas aussehen this:. Ich bin nur nicht mit der entsprechenden Syntax für meinen Fall vertraut. Eine gute Referenz würde ausreichen. Vielen Dank.

+0

struct.unpack scheint der Weg zu gehen, aber ich bin mir nicht sicher, was ich für meinen Fall tun soll. – Griff

+0

Machen Sie eine der [Methoden mit scipy/numpy] (http://www.scipy.org/Cookbook/InputOutput#head-b0de67a6dbb3b1ba2584c65263552dc519225cb1) Ihnen helfen? –

+0

Sie finden die Lösung hier: http://stackoverflow.com/questions/10475839/reading-a-direct-access-fortran-unformatatted-file-in-python – milancurcic

Antwort

8

IRO-bietet den Link Verwendung von I geändert/machte diese für meinen Skript (nichts anderes als numpy Magie):

def readslice(inputfilename,ndim): 
    shape = (ndim,ndim,ndim) 
    fd = open(fname, 'rb') 
    data = np.fromfile(file=fd, dtype=np.double).reshape(shape) 
    fd.close() 
    return data 

Ich habe ein Mittelwert, max, min & Summe auf dem Würfel und sie paßt mein Fortran-Code. Danke für Ihre Hilfe.

+0

Stellen Sie einfach sicher, Sie berücksichtigen Array-Dimension Reihenfolge Unterschied zwischen Fortran (Spaltenhaupt) und Python (Zeilenhaupt). – milancurcic

+0

Gibt es nicht einen Befehl, um es als Fortran am Ende von .reshape (shape) neu zu ordnen? – Griff

+0

Wenn Fortran-Array als Dimension (im, jm, km) deklariert wird, möchten Sie es aus Python als np.fromfile (file = fd, dtype = np.double) .reshape ((km, jm, Ich bin)). Im Fall von im = jm = km benötigen Sie keine zusätzlichen Schritte, aber denken Sie daran, dass der letzte Index am schnellsten variiert. – milancurcic

0

Ich kann nichts anderes als eine direkte Lese hier arbeiten sehen. Python macht keine gute Arbeit mit 2D-Arrays, geschweige denn 3-D, aber dieses bisschen Code sollte funktionieren.

fin=open('filename.dat','rb') 
output=[] 
for x in range(0,ndim): 
    xarr=[] 
    for y in range(0,ndim): 
     yarr=[] 
     for z in range(0,ndim): 
      yarr.append(struct.unpack('i', fin.read(4))) 
     xarr.append(yarr) 
    output.append(xarr) 
Verwandte Themen