7

我在 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)

我想把它读回到 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]);

我只需要 Python 中的等价物——大概有一个类似的加载/重塑工具可用。如果有更友好的紧凑方式将其写出来以供 Python 理解,我愿意接受建议。它大概看起来像这样:。我只是不熟悉我的案例的等效语法。一个好的参考就足够了。谢谢。

4

2 回答 2

8

使用 IRO-bot 的链接,我为我的脚本修改/制作了这个(除了 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

我在立方体上做了一个平均值、最大值、最小值和总和,它与我的 fortran 代码相匹配。谢谢你的帮助。

于 2012-12-11T20:51:54.250 回答
0

除了在这里工作的直接阅读之外,我什么也看不到。Python 不能很好地处理 2-D 数组,更不用说 3-d,但是这段代码应该可以工作。

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)
于 2012-12-11T20:40:41.613 回答