SciPy.io.FortraFile
方法和NumPy.fromfile
方法,但都没有成功。我还用IDL读取了该文件,它可以正常工作,因此我有一个数据应该是什么样子的基准。我希望有人能指出我犯了一个愚蠢的错误——没有比犯了一个傻瓜错误然后洗手不干更好的事情了……
数据bcube1具有101x101x101x3的维度,类型为r*8。总共有3090903个条目。它们使用以下语句编写(不是我的代码,而是从源代码复制的)。
open (unit=21, file=bendnm, status='new'
. ,form='unformatted')
write (21) bcube1
close (unit=21)
我可以使用以下代码(也不是我的代码,是从同事那里复制的)在IDL中成功读取它:
bcube=dblarr(101,101,101,3)
openr,lun,'bcube.0000000',/get_lun,/f77_unformatted,/swap_if_little_endian
readu,lun,bcube
free_lun,lun
返回的数据(bcube)是双精度的,具有尺寸为101x101x101x3的维度,因此文件的标题信息知道其维度(未压缩)。
现在我尝试使用Python获得相同的效果,但没有成功。我已经尝试了以下方法。
In [30]: f = scipy.io.FortranFile('bcube.0000000', header_dtype='uint32')
In [31]: b = f.read_record(dtype='float64')
该代码返回错误:Size obtained (3092150529) is not a multiple of the dtypes given (8)
。更改数据类型(dtype)可以更改得到的大小,但它仍然不能被8整除。
或者,使用fromfile
没有出现错误,但返回的数组中有一个额外的值(可能是页脚),并且个别的数组值完全不正确(应该都是阶数为1)。
In [38]: f = np.fromfile('bcube.0000000')
In [39]: f.shape
Out[39]: (3090904,)
In [42]: f
Out[42]: array([ -3.09179121e-030, 4.97284231e-020, -1.06514594e+299, ...,
8.97359707e-029, 6.79921640e-316, -1.79102266e-037])
我尝试使用byteswap来查看是否可以使浮点值更合理,但是并没有成功。
我认为
np.fromfile
方法非常接近工作状态,但读取头信息的方式可能有问题。有人能否建议我如何找出应该在头文件中的内容,以便IDL知道数组的维度和数据类型?是否有一种方法可以传递头信息给fromfile
,以便它知道如何处理前导条目?
np.fromfile(fname)
返回的值比数组中的值多?在我的情况下,应该有3090903个条目,但结果有3090904个条目。为什么它返回的值与源数组中的值不相等? - NoMansEyesnp.fromfile
,它会读取没有任何头部或尾部的原始数据。如果您的文件有头部(并且希望您知道它有多长),我相信您可以通过将一个已经使用open
和seek
打开的文件传递给np.fromfile
来跳过头部。如果您的文件有尾部,请使用np.fromfile
的count
参数。如果您不确定头部/尾部的长度,请使用0.
进行实验,并使用十六进制编辑器观察文件。 - ZisIsNotZis