¿Cómo acceder a los elementos de numpy ndarray?

Estoy usando la función loadmat de loadmat para cargar un archivo de datos matlab en python.

 from scipy.io import loadmat data = loadmat('data.mat') fields = data['field'] 

El tipo de fields es numpy.ndarray :

 print 'fields type={}'.format(type(fields)) print 'fields dtype={}'.format(fields.dtype) print 'fields shape={}'.format(fields.shape) 
 fields type= fields dtype=object fields shape=(5,) 

Yo itero sobre la matriz usando nditer :

 for x in np.nditer(fields, flags=['refs_ok']): print 'x={}'.format(x) print 'x type={}'.format(type(x)) print 'x dtype={}'.format(x.dtype) print 'x shape={}'.format(x.shape) break 
 x=[u'ACE'] x type= x dtype=object x shape=() 

IndexError:

Si trato de acceder al primer elemento de x obtengo un IndexError :

 x[0] 
 --------------------------------------------------------------------------- IndexError Traceback (most recent call last)  in () 17 print 'type={}'.format(type(x)) 18 print 'dtype={}'.format(x.dtype) ---> 19 x[0] 20 break 21 IndexError: too many indices for array 

Preguntas:

  • ¿Por qué, si type(x) devuelve nump.ndarray , dice “demasiados índices para la matriz”?
  • ¿Cómo puedo extraer el contenido de x en una cadena?

Aquí están las versiones que estoy usando:

 print 'python version: {}'.format(sys.version) print 'numpy version: {}'.format(numpy.__version__) print 'scipy version: {}'.format(scipy.__version__) 
 python version: 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] numpy version: 1.11.0 scipy version: 0.17.1 

Sin mirar en detalle tus errores, puedo señalar algunas trampas.

El .mat contendrá matrices MATLAB (siempre 2d o superior), celdas y estructuras.

loadmat rinde los de varias maneras. Hay diccionarios que tienes que indexar por nombre. Hay matrices de objetos (dtype = object). Y hay nd matrices numéricas o de cadenas. Puede que tenga que trabajar a través de varios niveles para llegar a la matriz numérica.

Compruebe la ‘forma’ (tamaño) de una matriz y su ‘dtype’. Si la forma es () y dtype objeto, entonces dtype con y=x[()] .

Aquí hay un ejemplo de una matriz de objetos 0d:

 In [4]: y=np.arange(3) In [5]: x=np.empty((), dtype=object) In [6]: x[()]=y In [7]: x Out[7]: array(array([0, 1, 2]), dtype=object) In [8]: x.shape Out[8]: () In [9]: x.dtype Out[9]: dtype('O') In [10]: x[0] ... IndexError: too many indices for array In [11]: x[()] Out[11]: array([0, 1, 2]) 

x es una matriz 0d (x.ndim), por lo que debe indexarse ​​con una tupla de elemento 0, () . Para un progtwigdor de MATLAB eso puede parecer extraño.

En numpy (Python en general), x[a,b,c] es lo mismo que x[(a,b,c)] e ind=(a,b,c); x[ind] ind=(a,b,c); x[ind] . En otras palabras, los argumentos en [] se entienden como una tupla de valores. (1,2) es una tupla de 2 elementos, (1,) es un elemento ( (1) es solo una agrupación), y () es una tupla de 0 elementos. Entonces x[()] es solo una extensión de la notación de indexación nd regular. No es un caso especial.