2010-08-23 15 views
45

sto usando NumPy e vogliono indice di fila senza perdere le informazioni dimensione.Numpy fetta indice senza perdere informazioni dimensione

import numpy as np 
X = np.zeros((100,10)) 
X.shape  # >> (100, 10) 
xslice = X[10,:] 
xslice.shape # >> (10,) 

In questo esempio xslice è ora 1 dimensione, ma voglio che sia (1,10). In R, userei X [10,:, drop = F]. C'è qualcosa di simile in Numpy. Non sono riuscito a trovarlo nella documentazione e non ho visto una domanda simile.

Grazie!

risposta

29

Probabilmente è più facile da fare x[None, 10, :] o equivalentemente (ma più leggibile) x[np.newaxis, 10, :].

Per quanto riguarda il motivo per cui non è il default, personalmente, trovo che avere costantemente le matrici con dimensioni di unico diventa fastidioso molto rapidamente. Immagino che gli sviluppatori di Numpy si sentissero allo stesso modo.

Inoltre, NumPy gestire la trasmissione array molto bene, quindi di solito c'è poco motivo di mantenere la dimensione della matrice fetta venuto. Se così fosse, allora le cose come:

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

o non avrebbe funzionato o sarebbe molto più difficile da attuare.

(o almeno questo è il mio indovinare il ragionamento del dev NumPy dietro cadere informazioni di quota quando affettare)

+4

Questo si sente così sbagliato ... – sebpiq

+1

In realtà, 'x [10,:, Nessuno]' restituisce un array di forma '(10,1)', 'non (1,10)' .. – Lisa

+4

@Lisa: 'x [Nessuno, 10] 'farà quello che vuoi. – naught101

13

ho trovato alcune soluzioni ragionevoli.

1) usare numpy.take(X,[10],0)

2) utilizzare questo strano indicizzazione X[10:11:, :]

Idealmente, questo dovrebbe essere il default. Non ho mai capito perché le dimensioni sono mai cadute. Ma questa è una discussione per numpy ...

+0

opzione # 2 è abbastanza impressionante. –

38

Un'altra soluzione è quella di fare

X[[10],:] 

o

I = array([10]) 
X[I,:] 

la dimensionalità un array viene conservato quando l'indicizzazione viene eseguita da un elenco (o un array) di indici. Questo è bello perché ti lascia con la scelta tra mantenere la dimensione e stringere.

+5

Questa è di gran lunga la soluzione migliore. – Will

+1

Copia i dati dell'array – Per

+0

Questo non è sempre il caso. Vedi: 'x = np.array ([[1,2,3,4]])' se lo si affetta con 'x [[0], [1,2]]' si ottiene la matrice unidimensionale ' ([2, 3]) "La mia opinione è quando si selezionano i vettori di colonna o di riga è meglio rendere la slice semplice e quindi usare' np.reshape', quindi nel mio esempio sarebbe 'np.reshape (x [0, [ 1,2]], [1,2]) ' – Alexander

Problemi correlati