2010-11-03 29 views
14

Tôi đang lưu các mảng NumPy sử dụng hàm numpy.save. Tôi muốn các nhà phát triển khác có khả năng đọc dữ liệu từ những tệp đó bằng ngôn ngữ C. Vì vậy, tôi cần biết, cách tổ chức dữ liệu nhị phân một cách gọn gàng trong tệp.OK, hiển nhiên khi tôi đang lưu mảng 'i4' nhưng mảng mảng chứa một số cấu trúc thì sao? Không thể tìm thấy bất kỳ thông tin nào trong tài liệuDữ liệu cách được lưu trữ trong * .npy là gì?

UPD: phép nói tha dữ liệu là một cái gì đó như:

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

UPD2: điều gì về tiết kiệm "năng động" dữ liệu (dtype - đối tượng)

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ó thật để đọc rằng điều từ C ?

Trả lời

27

Định dạng tệp npy được ghi lại trong số https://github.com/numpy/numpy/blob/master/doc/neps/npy-format.rst của numpy.

Ví dụ, mã

>>> 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) 

kết quả trong file:

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

Cảm ơn, đó là mẫu đơn giản nhất –

+0

Điều gì về mảng mảng có chứa một số cấu trúc? Thứ tự dữ liệu trong trường hợp đó là gì? Trong các phần tử ma trận ví dụ của bạn được lưu trữ theo hàng, hiển nhiên, tôi muốn biết các cửa hàng lộn xộn như thế nào dữ liệu phức tạp –

+0

@taras: Xem cập nhật. Bạn nên chỉnh sửa câu hỏi của bạn để cho thấy nó phức tạp như thế nào (dữ liệu mẫu) nếu điều đó vẫn không đủ phức tạp. – kennytm

3

Định dạng được mô tả trong numpy/lib/format.py, nơi bạn cũng có thể xem mã nguồn Python sử dụng để tải file NPY. np.load được định nghĩa here.

Các vấn đề liên quan