2011-01-17 24 views
7

Sto cercando di indicizzare un numero numpy.array con dimensioni diverse durante il runtime. Per recuperare ad es. la prima riga di un * m matrice a, si può semplicemente fareIndicizzazione di matrice numpy.array unidimensionale come matrice

a[0,:] 

Tuttavia, nel caso in cui un sembra essere un vettore 1xn, questo codice precedente restituisce un errore di indice:

IndexError: too many indices

Poiché il codice deve essere eseguito nel modo più efficiente possibile, non desidero introdurre un'istruzione if. Qualcuno ha una soluzione conveniente che idealmente non comporta la modifica di qualsiasi tipo di struttura dei dati?

+0

Si dispone solo di array 1 e 2D? – Paul

+0

Semplicemente rimodellando l'array in modo che fosse un array 1xd 2n invece di un conteggio array di lunghezza 1d come "modifica del tipo di struttura dati"? –

+0

Tutti questi sono array 2D (mxn) in teoria, alcuni sono semplicemente diventati array 1xn, ad es. m = 1. Infatti rappresentano tabelle di probabilità condizionale e il caso m = 1 corrisponde a una variabile che non ha alcuna dipendenza. – Alain

risposta

9

Basta usare a[0] anziché a[0,:]. Restituirà la prima riga per una matrice e la prima voce per un vettore. E 'questo quello che stai cercando?

Se si desidera ottenere l'intero vettore nel caso monodimensionale, è possibile utilizzare numpy.atleast_2d(a)[0]. Non copierà il tuo vettore - lo accederà semplicemente come un array 1 x n bidimensionale.

+1

Non sapevo di atleast_2d; maneggevole. +1 –

+0

Posso in secondo luogo che, numpy.atleast_2d è molto utile ed esattamente quello che stavo cercando. Molte grazie. – Alain

1

Dalla sezione 'array' or 'matrix'? Which should I use? della pagina 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.

Ecco un esempio che mostra che essi non sono la stessa cosa:

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

Così, sei sicuro che tutti gli array sono Array 2D, o alcuni di essi sono array 1d?

Se si desidera utilizzare il comando di array[0,:], si consiglia di utilizzare effettivamente matrici 1xN 2d anziché 1d matrici. Ecco un esempio:

>>> 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]) 
Problemi correlati