2012-12-11 6 views
7

pisałem na matrycę w Fortran następująco:jak czytać outputted Fortran binarnej macierzy NxNxN w Pythonie

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) 

Chcę przeczytać powrotem do Pythona. Wszystko, co widziałem, dotyczy tablic 2D NxN, a nie tablic 3D. W Matlab mogę go odczytać jako:

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

Muszę tylko równowartość w Pythonie - przypuszczalnie jest podobny ładunek/przekształcenia narzędzie dostępne. Jeśli istnieje bardziej przyjazny i kompaktowy sposób na napisanie go dla zrozumienia Pythona, jestem otwarty na sugestie. Prawdopodobnie będzie wyglądać na coś this:. Nie jestem obeznany z równoważną składnią mojej sprawy. Wystarczyłoby dobre odniesienie. Dzięki.

+0

struct.unpack wydaje się droga, ale nie jestem pewien, co zrobić dla mojego przypadku. – Griff

+0

Wykonaj dowolną z tych metod z użyciem [scipy/numpy] (http://www.scipy.org/Cookbook/InputOutput#head-b0de67a6dbb3b1ba2584c65263552dc519225cb1) pomóc? –

+0

Znajdziecie rozwiązanie tutaj: http://stackoverflow.com/questions/10475839/reading-a-direct-access-fortran-unformatted-file-in-python – milancurcic

Odpowiedz

8

Korzystanie Iro-bot jest odnośnik zmodyfikowałem/wykonane to dla mojego skryptu (nic ale numpy magii):

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 

Zrobiłem średnia, max, min & suma na kostce i pasuje mój fortranowy kod. Dzięki za pomoc.

+0

Tylko upewnij się uwzględniać wymiar tablicy zamawiania różnicę między Fortran (kolumna główna) i Python (wiersz główny). – milancurcic

+0

Czy nie ma polecenia nakazującego zmianę kolejności na fortran na końcu .reshape (kształt)? – Griff

+0

W przypadku deklaracji tablicy Fortran jako wymiaru (im, jm, km), należy ją odczytać z Pythona jako plik np.fromfile (file = fd, dtype = np.double) .reshape ((km, jm, im)). W przypadku im = jm = km, nie potrzebujesz żadnych dodatkowych kroków, ale pamiętaj, że ostatni indeks zmienia się najszybciej. – milancurcic

0

nie widzę niczego oprócz bezpośredniego odczytu pracy tutaj. Python nie radzi sobie świetnie z tablicami 2-D, nie mówiąc już o 3-d, ale ten fragment kodu powinien działać.

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)