2 回答
TA贡献1839条经验 获得超15个赞
在我的问题中更新之后,我意识到我的循环方式有误。我当然在发出赏金后大约 10 分钟发现了这一点,好吧。
错误在于使用一天来遍历记录。这将不起作用,因为它每个循环迭代一次,没有将记录推得足够远。因此,为什么有些分钟高于最大值。新代码是:
while nday < 365:
tmax = numpy.append(tmax, data[(nx*ny)*rm:(nx*ny)*(rm + 1)].reshape((nx,ny), order='F'))
rm = rm + 2
tmin = numpy.append(tmin, data[(nx*ny)*rm:(nx*ny)*(rm + 1)].reshape((nx,ny), order='F'))
rm = rm + 2
nday += 1
这使用了记录移动器(或rm我称之为)来移动记录适当的数量。这就是它所需要的。
TA贡献1865条经验 获得超7个赞
虽然 Fortran 二进制文件的确切格式取决于编译器,但在所有情况下,我都知道直接访问文件(access='direct'
如本问题中那样打开的文件)在记录之间没有任何记录标记。每条记录的大小都是固定的,由语句recl=
中的OPEN
说明符给出。也就是说,记录N
从(N - 1) * RECL
文件中的偏移字节开始。
一个可移植性问题是 的单位recl=
是file storage unit
s。对于大多数编译器,file storage unit
以 8 位八位字节指定大小(如 Fortran 标准的最新版本所推荐),但对于英特尔 Fortran 编译器,recl=
以 32 位为单位;有一个命令行选项-assume byterecl
可用于使英特尔 Fortran 与大多数其他编译器相匹配。
因此,在此处给出的示例中,假设为 8 位file storage unit
,则您的 recl 将为 1036800 字节。
此外,查看代码,似乎假设数组是 4 字节类型(例如整数或单精度实数)。因此,如果它是单精度实数,并且文件是以小端创建的,那么<f4
您使用的 numpy dtype似乎是正确的选择。
现在,回到英特尔 Fortran 编译器的问题上,如果文件是由 ifort 创建的,-assume byterecl
那么您想要的数据将位于每条记录的第一季度,其余部分是填充(全为零或什至随机数据?) . 然后你必须做一些额外的体操来提取python中的正确数据而不是填充。通过检查文件的大小,是它nx * ny * 4 * nday *4
还是nx * ny * 4 * nday * 4 * 4
字节,应该很容易检查这一点?
添加回答
举报