Чтение неформатированного файла Fortran с прямым доступом в Python

Я совершенно не знаком с Python и пишу свои коды визуализации на Python с нуля (чтобы избежать использования дорогих проприетарных программ, таких как IDL). До сих пор я использовал IDL и gnuplot. Что я хочу сделать, так это:

Я пишу двумерные массивы в неформатированные файлы прямого доступа, используя fortran, которые я хочу иметь возможность читать в python. Точный тестовый код приведен ниже. Фактический код представляет собой огромный параллельный код, но выходные данные имеют почти такой же формат.

program binary_out
implicit none
integer :: i,j,t,rec_array
double precision, dimension(100,100) :: fn
double precision, parameter :: p=2*3.1415929
INQUIRE(IOLENGTH=rec_array) fn
open(unit=10,file='test',status='new',form='unformatted',access='direct',recl=rec_array)                                                                           
   fn=0
   write(10,rec=1) fn
do t=1,3
do i=1,100
   do j=1,100
      fn(i,j)=sin(i*p*t/100)*cos(j*p*t/100)
   enddo
enddo
   write(10,rec=t+1) fn
enddo
close(10)
end program binary_out

Программа должна выдавать мне нули при t=1 и увеличивать количество «островков» при увеличении значения t. Но когда я читаю его, используя приведенный ниже код Python, я получаю только нули. Если я удаляю первый оператор записи нулей, я просто получаю первый временной срез независимо от того, какое значение «временного среза» я использую в коде Python.Код, который у меня есть на данный момент, таков:

#!/usr/bin/env python
import scipy
import glob
import numpy as np
import matplotlib.pyplot as plt
import os, sys
from pylab import *

def readslice(inputfilename,field,nx,ny,timeslice):
   f=open(inputfilename,'r')
   f.seek(timeslice*nx*ny)
   field=np.fromfile(inputfilename,dtype='d',count=nx*ny)
   field=np.reshape(field,(nx,ny))
   return field

a=np.dtype('d')
a=readslice('test',a,100,100,2)

im=plt.imshow(a)
plt.show()

Я хочу, чтобы срез чтения по умолчанию мог читать запись с i-го места, если слайс времени равен i. Для этого я пытался использовать f.seek, но, похоже, он не работает. numpy.fromfile, кажется, начинает читать с самой первой записи. Как заставить numpy.fromfile читать из определенной точки файла?

Я все еще пытаюсь привыкнуть к стилю Python и копаться в документации. Любая помощь и указатели будут очень признательны.

5
задан PearsonArtPhoto 11 December 2012 в 20:33
поделиться