用dtype读取二进制文件会导致ValueError

时间:2018-09-03 10:52:07

标签: python numpy

我有一个要使用python例程读取的二进制文件。为此,创建了一个dtype对象,该对象描述了数据的外观。应当创建的dtype对象是形式为{'field1':...,'field2':...,...}的字典。这样, obj 是一个(数据类型,偏移量)-(请参见numpy documentation)的元组。如果在创建dtype的过程中offset超出了C int的范围,则会出现错误。

重现该错误的最小示例:

dict_tmp = dict()
offset = 2281832888
dict_tmp['/timedisc/pressure'] = ('(4096, 4096)>f8', offset)
dtype = np.dtype(dict_tmp)

ValueError:整数不适合C int

如果我将偏移量减小到32位整数范围以下,则错误当然消失了。我已经尝试过将偏移值手动转换为int64或uint32,但这也无法正常工作。据我所知,dtype是numpy中multiarray的一部分,在这一点上我有点迷茫。

是否有可能加载数据并避免错误?

1 个答案:

答案 0 :(得分:2)

dtypes实际上仅限于int32偏移量(例如<2 ^ 31,另请参见https://github.com/numpy/numpy/issues/11869#issuecomment-418330815) 我猜您想使用此dtype从使用numpy memmap的文件读取。这可以通过以下代码段实现:

f = np.memmap(file)
arr1 = np.ndarray(buffer=f, dtype=np.dtype('<f8'), shape=(4096,4096), offset=2281832888)

像这样构造ndarray实际上是memmap内部执行的操作,但是在此解决方案中dtype不必存储偏移量,而是将其直接传递给ndarray构造函数。