相关疑难解决方法(0)

如何将输出的fortran二进制NxNxN矩阵读入Python

我在Fortran中写了一个矩阵,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

我想把它读回Python.我见过的所有东西都是2D NxN阵列而不是3D阵列.在Matlab中我可以读作:

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

我只需要Python中的等价物 - 可能有一个类似的加载/重塑工具可用.如果有一个更友好的紧凑方式来写出来让Python理解,我愿意接受建议.它可能看起来像这样:.我只是不熟悉我的情况的等效语法.一个很好的参考就足够了.谢谢.

python binary fortran numpy matrix

7
推荐指数
1
解决办法
2549
查看次数

在Python中读取直接访问fortran无格式文件

我是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
Run Code Online (Sandbox Code Playgroud)

该程序应该给我t = 1的零和增加"岛"的数量以增加t的值.但是当我使用下面给出的python代码读取它时,我只是得到了零.如果我删除第一个零的写语句,我只是得到第一次切片,而不管我在python代码中使用的"timeslice"的值.我到目前为止的代码是:

#!/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()
Run Code Online (Sandbox Code Playgroud)

如果时间片等于i,我希望def readlice能够在第i个位置读取记录.为此,我试图使用f.seek,但它似乎不起作用.numpy.fromfile似乎开始从第一个记录本身读取.如何让numpy.fromfile从文件中的特定点读取?

我仍然在尝试习惯Python风格并深入研究文档.任何帮助和指示将不胜感激.

python fortran file

5
推荐指数
1
解决办法
7046
查看次数

标签 统计

fortran ×2

python ×2

binary ×1

file ×1

matrix ×1

numpy ×1