有没有办法在不加载整个文件的情况下读取.npy标头?

时间:2020-10-06 13:00:13

标签: python numpy

我有许多大的.npy文件,我想读取其头文件而不将文件加载到内存中。我之所以这样问是因为我只需要标题信息,但是加载整个文件会减慢计算速度。

2 个答案:

答案 0 :(得分:3)

是的,numpy.lib.format是相关的模块,但是如何使用它的文档并没有得到很好的记录,并且IMO应该为此提供一个更易于使用的内置函数。但是你可以做到的。

首先,您需要确定文件的格式版本,然后使用read_array_header_1_0read_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)}