我完全不懂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()
我希望 def readslice 能够在 timeslice 等于 i 时读取第i个位置的记录。 我尝试使用 f.seek,但似乎不起作用。numpy.fromfile 似乎从第一条记录开始读取。我如何使 numpy.fromfile 从文件中的特定点开始读取? 我仍在努力适应 Python 风格并深入研究文档。任何帮助和指针将不胜感激。