2010-11-03 23 views
14

我使用numpy.save函數保存NumPy數組。 我希望其他開發人員能夠使用C語言從這些文件中讀取數據。 所以我需要知道,numpy是如何在file.OK中組織二進制數據的,當我保存'i4'數組時顯而易見,但包含某些結構的數組數組又如何呢?在文檔中找不到任何信息數據存儲在* .npy中的方式是什麼?

UPD: 可以說THA數據是一樣的東西:

dt = np.dtype([('outer','(3,)<i4'),('outer2',[('inner','(10,)<i4'),('inner2','f8')])]) 

UPD2:怎麼樣節省 「動態」 數據(D類 - 對象)

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說事兒?

回答

27

npy文件格式記錄在numpy的https://github.com/numpy/numpy/blob/master/doc/neps/npy-format.rst中。

例如,代碼

>>> 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 
+0

謝謝,這是最簡單的樣本 – 2010-11-03 18:20:27

+0

那麼包含一些結構的數組的數組呢?在這種情況下數據的順序是什麼?在你的示例中,矩陣元素是按行存儲的,很明顯,我想知道numpy存儲複雜的數據 – 2010-11-03 18:22:23

+0

@taras:查看更新。如果這個問題仍然不夠複雜,你應該編輯你的問題以顯示它的複雜程度(樣本數據)。 – kennytm 2010-11-03 18:35:34

相關問題