2012-12-11 24 views
7

ho scritto una matrice in Fortran come segue:come leggere una matrice binaria NxNxN FORTRAN emesso in Python

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) 

voglio leggere questo nuovo in Python. Tutto ciò che ho visto è per gli array 2D NxN e non per gli array 3D. In Matlab posso leggere come:

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

Ho solo bisogno l'equivalente in Python - presumibilmente c'è un carico simile/rimodellare strumento a disposizione. Se c'è un modo più amichevole e compatto di scrivere per Python per capire, sono aperto a suggerimenti. Presumibilmente sembrerà qualcosa di this:. Non ho familiarità con la sintassi equivalente per il mio caso. Un buon riferimento sarebbe sufficiente. Grazie.

+0

struct.unpack sembra la strada da percorrere ma non sono sicuro di cosa fare per il mio caso. – Griff

+0

È utile uno di [questi metodi che utilizzano scipy/numpy] (http://www.scipy.org/Cookbook/InputOutput#head-b0de67a6dbb3b1ba2584c65263552dc519225cb1)? –

+0

La soluzione è disponibile qui: http://stackoverflow.com/questions/10475839/reading-a-direct-access-fortran-unformatted-file-in-python – milancurcic

risposta

8

Utilizzando il legame di IRO-bot ho modificato/fatto questo per il mio script (altro che la magia NumPy):

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 

ho fatto una media, massimo, minimo & somma sul cubo e che corrisponda il mio codice Fortran. Grazie per l'aiuto.

+0

Assicurati di prendere in considerazione la differenza nell'ordinamento delle dimensioni dell'array tra Fortran (colonna maggiore) e Python (riga maggiore). – milancurcic

+0

Non c'è un comando per dirgli di riordinare come fortran alla fine di .reshape (forma)? – Griff

+0

Nel caso che l'array Fortran sia dichiarato come dimensione (im, jm, km), si vorrebbe leggerlo da Python come np.fromfile (file = fd, dtype = np.double) .reshape ((km, jm, sono)). Nel caso di im = jm = km, non hai bisogno di ulteriori passaggi, ma ricorda che l'ultimo indice varia più velocemente. – milancurcic

0

Non riesco a vedere altro che una lettura diretta che funziona qui. Python non fa un buon lavoro con gli array 2D, per non parlare del 3-d, ma questo bit di codice dovrebbe funzionare.

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) 
Problemi correlati