*.npy文件中数据是如何存储的?
我正在使用numpy.save函数来保存NumPy数组。我希望其他开发者能够用C语言读取这些文件中的数据。所以我需要了解,NumPy是如何在文件中组织这些二进制数据的。比如,当我保存一个'i4'类型的数组时,这个过程很明显,但如果是包含一些结构的数组数组呢?在文档中找不到相关信息。
更新:假设数据是这样的:
dt = np.dtype([('outer','(3,)<i4'),('outer2',[('inner','(10,)<i4'),('inner2','f8')])])
更新2:那保存“动态”数据(数据类型为对象)呢?
import numpy as np
a = [0,0,0]
b = [0,0]
c = [a,b]
dtype = np.dtype([('Name', '|S2'), ('objValue', object)])
data = np.zeros(3, dtype)
data[0]['objValue'] = a
data[1]['objValue'] = b
data[2]['objValue'] = c
data[0]['Name'] = 'a'
data[1]['Name'] = 'b'
data[2]['Name'] = 'c'
np.save(r'D:\in.npy', data)
用C语言读取这些数据真的可行吗?
2 个回答
6
这个格式的详细说明可以在 numpy/lib/format.py 这个链接里找到,在那里你还可以看到用来加载npy文件的Python源代码。而 np.load
的定义可以在 这里 找到。
51
npy文件格式的详细信息可以在numpy的NEP 1 — NumPy数组的简单文件格式中找到。
举个例子,下面的代码
>>> dt=numpy.dtype([('outer','(3,)<i4'),
... ('outer2',[('inner','(10,)<i4'),('inner2','f8')])])
>>> a=numpy.array([((1,2,3),((10,11,12,13,14,15,16,17,18,19),3.14)),
... ((4,5,6),((-1,-2,-3,-4,-5,-6,-7,-8,-9,-20),6.28))],dt)
>>> numpy.save('1.npy', a)
会生成一个文件:
93 4E 55 4D 50 59 magic ("\x93NUMPY")
01 major version (1)
00 minor version (0)
96 00 HEADER_LEN (0x0096 = 150)
7B 27 64 65 73 63 72 27
3A 20 5B 28 27 6F 75 74
65 72 27 2C 20 27 3C 69
34 27 2C 20 28 33 2C 29
29 2C 20 28 27 6F 75 74
65 72 32 27 2C 20 5B 28
27 69 6E 6E 65 72 27 2C
20 27 3C 69 34 27 2C 20
28 31 30 2C 29 29 2C 20
28 27 69 6E 6E 65 72 32 Header, describing the data structure
27 2C 20 27 3C 66 38 27 "{'descr': [('outer', '<i4', (3,)),
29 5D 29 5D 2C 20 27 66 ('outer2', [
6F 72 74 72 61 6E 5F 6F ('inner', '<i4', (10,)),
72 64 65 72 27 3A 20 46 ('inner2', '<f8')]
61 6C 73 65 2C 20 27 73 )],
68 61 70 65 27 3A 20 28 'fortran_order': False,
32 2C 29 2C 20 7D 20 20 'shape': (2,), }"
20 20 20 20 20 20 20 20
20 20 20 20 20 0A
01 00 00 00 02 00 00 00 03 00 00 00 (1,2,3)
0A 00 00 00 0B 00 00 00 0C 00 00 00
0D 00 00 00 0E 00 00 00 0F 00 00 00
10 00 00 00 11 00 00 00 12 00 00 00
13 00 00 00 (10,11,12,13,14,15,16,17,18,19)
1F 85 EB 51 B8 1E 09 40 3.14
04 00 00 00 05 00 00 00 06 00 00 00 (4,5,6)
FF FF FF FF FE FF FF FF FD FF FF FF
FC FF FF FF FB FF FF FF FA FF FF FF
F9 FF FF FF F8 FF FF FF F7 FF FF FF
EC FF FF FF (-1,-2,-3,-4,-5,-6,-7,-8,-9,-20)
1F 85 EB 51 B8 1E 19 40 6.28