我有许多大的.npy文件,我想读取其头文件而不将文件加载到内存中。我之所以这样问是因为我只需要标题信息,但是加载整个文件会减慢计算速度。
答案 0 :(得分:3)
是的,numpy.lib.format
是相关的模块,但是如何使用它的文档并没有得到很好的记录,并且IMO应该为此提供一个更易于使用的内置函数。但是你可以做到的。
首先,您需要确定文件的格式版本,然后使用read_array_header_1_0
或read_array_header_2_0
使用。您也可以使用内部函数_read_array_header
,尽管内部是read_array_header
,但实际上更易于使用。在这里,我实现了与版本无关的import numpy.lib.format
def read_array_header(fobj):
version = numpy.lib.format.read_magic(fobj)
func_name = 'read_array_header_' + '_'.join(str(v) for v in version)
func = getattr(numpy.lib.format, func_name)
return func(fobj)
:
>>> with open('test.npy', 'rb') as fobj:
... print(read_array_header(fobj))
...
((10,), False, dtype('int64'))
用法:
merge.properties
返回数组的形状(是否为F连续的)和dtype。
答案 1 :(得分:0)
与user8408080 correctly noted一样,格式也有据可查。
一个简单的窥视功能可以是:
import ast
import struct
def read_npy_meta(fh):
magic = fh.read(6)
assert magic == b"\x93NUMPY"
version = fh.read(2)
header_size, = struct.unpack("<h", fh.read(2))
header = fh.read(header_size)
return ast.literal_eval(header.decode("utf-8"))
>>> with open("my_npy_file.npy", "rb") as f:
... meta = read_npy_meta(f)
>>> meta
{'descr': '<i2', 'fortran_order': False, 'shape': (100, 100, 100)}