2010-11-03 10 views
14

Estoy ahorrando matrices NumPy utilizando la función numpy.save. Quiero que otros desarrolladores tengan la capacidad de leer datos de esos archivos usando el lenguaje C. por lo que necesito saber, cómo numpy organiza los datos binarios en file.OK, es obvio cuando estoy ahorrando gama de 'i4', pero ¿qué pasa con matriz de matrices que contiene algunas estructuras? No se puede encontrar ninguna información en la documentación¿De qué manera se almacenan los datos en * .npy?

UPD: digamos tha de datos es algo así como:

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

UPD2: ¿Qué hay de guardar los datos "dinámicos" (dtype - objeto)

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) 

¿es real para leer esa cosa de C ?

Respuesta

27

El formato de archivo NPY se documenta en numpy de https://github.com/numpy/numpy/blob/master/doc/neps/npy-format.rst.

Por ejemplo, el código

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

resultados en el archivo:

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

Gracias, es la muestra más fácil –

+0

¿Qué pasa con la matriz de matrices que contiene algunas estructuras? ¿Cuál es el orden de los datos en ese caso? En su ejemplo, los elementos de la matriz se almacenan por filas, es obvio, quiero saber cómo tiendas numpy Datos complicados –

+0

@taras: Ver actualización. Debería editar su pregunta para mostrar lo complicado que es (los datos de muestra) si eso todavía no es lo suficientemente complicado. – kennytm

3

El formato se describe en numpy/lib/format.py, donde también se puede ver el código fuente de Python se utiliza para cargar los archivos de NPY. np.load se define here.

Cuestiones relacionadas