我可以在不阅读整个内容的情况下获得 numpy 保存文件的形状吗(例如 memmap)

Dav*_*rks 5 python numpy

我有一个很大的 numpy 文件保存到磁盘,我想在不读取整个文件的情况下确定形状。

我可以使用 获取形状np.load(filename),但是当我尝试使用相同的方法时,np.memmap似乎需要我提前知道形状,否则默认为以平面uint8值数组读取文件。

这是可能的吗?

wim*_*wim 5

是的,您将在文件的第一行中以纯文本形式找到该形状:

>>> a = np.random.rand(4,7)
>>> np.save('/tmp/a', a)
>>>
$ head -1 /tmp/a.npy
?NUMPYv{'descr': '<f8', 'fortran_order': False, 'shape': (4, 7), }
Run Code Online (Sandbox Code Playgroud)

这是解析此标头的代码:

>>> with open('/tmp/a.npy', 'rb') as f:
...     major, minor = np.lib.format.read_magic(f)
...     shape, fortran, dtype = np.lib.format.read_array_header_1_0(f)
...     
>>> shape
(4, 7)
Run Code Online (Sandbox Code Playgroud)


c-w*_*son 5

np.memmap 一般用于二进制文件,但是 np.load 能够以 memmap 模式加载 .npy 文件。无需形状或数据类型!尝试:

mmapped_array = np.load(filename, mmap_mode='r')
Run Code Online (Sandbox Code Playgroud)