Estructura de datos tipo matlab compleja en python (numpy / scipy)

Tengo datos actualmente estructurados como siguiendo en Matlab

item{i}.attribute1(2,j) 

Donde item es una celda de i = 1 .. n cada una contiene la estructura de datos de múltiples atributos, cada una matriz de tamaño 2, j donde j = 1 .. m. El número de atributos no es fijo.

Tengo que traducir esta estructura de datos a python, pero soy nuevo en numpy y en las listas de python. ¿Cuál es la mejor manera de estructurar estos datos en python con numpy / scipy?

Gracias.

A menudo he visto los siguientes enfoques de conversión:

matlab array -> python numpy array

matriz de células matlab -> lista de python

estructura matlab -> dict de python

Entonces, en su caso, eso correspondería a una lista de python que contenga dictados, que a su vez contienen matrices numpy como entradas.

item[i]['attribute1'][2,j]

Nota

¡No olvides la indexación 0 en python!

[Actualizar]

Adicional: Uso de clases.

Además de la conversión simple dada anteriormente, también podría definir una clase ficticia, por ejemplo,

 class structtype(): pass 

Esto permite el siguiente tipo de uso:

 >> s1 = structtype() >> print s1.a --------------------------------------------------------------------------- AttributeError Traceback (most recent call last)  in () ----> 1 print s1.a AttributeError: structtype instance has no attribute 'a' >> s1.a=10 >> print s1.a 10 

Su ejemplo en este caso se convierte, por ejemplo,

 >> item = [ structtype() for i in range(10)] >> item[9].a = numpy.array([1,2,3]) >> item[9].a[1] 2 

Si está buscando un buen ejemplo de cómo crear una matriz estructurada en Python, como se hace en MATLAB, le recomendamos que eche un vistazo a la página principal de scipy ( basics.rec ).

Ejemplo

 x = np.zeros(1, dtype = [('Table', float64, (2, 2)), ('Number', float), ('String', '|S10')]) # Populate the array x['Table'] = [1, 2] x['Number'] = 23.5 x['String'] = 'Stringli' # See what is written to the array print(x) 

La salida impresa es entonces:

 [([[1.0, 2.0], [1.0, 2.0]], 23.5, 'Stringli')] 

Desafortunadamente, no descubrí cómo se puede definir una matriz estructurada sin saber el tamaño de la matriz estructurada. También puede definir la matriz directamente con su contenido.

 x = np.array(([[1, 2], [1, 2]], 23.5, 'Stringli'), dtype = [('Table', float64, (2, 2)), ('Number', float), ('String', '|S10')]) # Same result as above but less code (if you know the contents in advance) print(x)