2011-01-17 16 views
7

Estoy tratando de indexar numpy.array con diversas dimensiones durante el tiempo de ejecución. Para recuperar, p. la primera fila de un * m gama a, puede hacerlo simplementeIndexación numpy.array unidimensional como matriz

a[0,:] 

Sin embargo, en el caso de una pasa a ser un vector 1xn, el código anterior devuelve un error de índice:

IndexError: too many indices

Como el código debe ejecutarse de la manera más eficiente posible, no quiero introducir una declaración if. ¿Alguien tiene una solución conveniente que idealmente no implica cambiar ningún tipo de estructura de datos?

+0

¿Solo tiene matrices de 1 y 2D? – Paul

+0

¿Simplemente remodelar la matriz para que sea una matriz 2d 1xn en lugar de una cuenta de matriz de 1 n longitud como "cambiar el tipo de estructura de datos"? –

+0

Todas estas son matrices en 2D (mxn) teóricamente, algunas simplemente pasan a ser matrices de 1xn, p. m = 1. De hecho, representan tablas de probabilidad condicionales y el caso m = 1 corresponde a una variable que no tiene dependencias. – Alain

Respuesta

9

Simplemente use a[0] en lugar de a[0,:]. Devolverá la primera línea para una matriz y la primera entrada para un vector. ¿Es esto lo que estás buscando?

Si desea obtener el vector completo en el caso unidimensional, puede usar numpy.atleast_2d(a)[0]. No copiará su vector; solo accederá a él como una matriz bidimensional de 1 x n.

+1

No sabía sobre atleast_2d; práctico. +1 –

+0

Puedo decir que numpy.atleast_2d es muy útil y es exactamente lo que estaba buscando. Muchas gracias. – Alain

1

Desde la sección 'array' or 'matrix'? Which should I use? de la página Numpy for Matlab Users wiki:

For array, the vector shapes 1xN, Nx1, and N are all different things. Operations like A[:,1] return a rank-1 array of shape N, not a rank-2 of shape Nx1. Transpose on a rank-1 array does nothing.

He aquí un ejemplo que demuestra que ellos no son los mismos:

>>> import numpy as np 
>>> a1 = np.array([1,2,3]) 
>>> a1 
array([1, 2, 3]) 
>>> a2 = np.array([[1,2,3]]) // Notice the two sets of brackets 
>>> a2 
array([[1, 2, 3]]) 
>>> a3 = np.array([[1],[2],[3]]) 
>>> a3 
array([[1], 
     [2], 
     [3]]) 

Así que, ¿está seguro de que todos sus matrices son 2d matrices, o son algunas de ellas matrices 1d?

Si desea utilizar su comando de array[0,:], recomendaría realmente utilizar matrices 1xN 2d en lugar de matrices de 1d. Aquí hay un ejemplo:

>>> a2 = np.array([[1,2,3]]) // Notice the two sets of brackets 
>>> a2 
array([[1, 2, 3]]) 
>>> a2[0,:] 
array([1, 2, 3]) 
>>> b2 = np.array([[1,2,3],[4,5,6]]) 
>>> b2 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> b2[0,:] 
array([1, 2, 3]) 
Cuestiones relacionadas