2016-06-16 28 views
5

Qualcuno può spiegare cosa sta facendo questo codice?aggiungendo array numpy con booleans

a = np.array([[1, 2], [3, 4]]) 
    a[..., [True, False]] 

Che cosa fa il [True, False]?

+0

Su numpy 1.10 e 1.11 questo è uguale a 'a [..., [1,0]]' più un FutureWarning. – kennytm

+0

e cosa significa? – JRR

+0

[numpy indicizzazione booleana] (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing) – MaThMaX

risposta

1

Ellipsis Notation e booleane come interi

From the numpy docs:

Ellipsis espandere il numero di: oggetti necessari per effettuare una tupla selezione della stessa lunghezza come x.ndim. Ci può essere un solo ellissi presente

True e Falseare just obfuscated 0 and 1. Prendendo l'esempio dalla documentazione:

x = np.array([[[1],[2],[3]], [[4],[5],[6]]]) 
x[...,0] 
# outputs: array([[1, 2, 3], 
#  [4, 5, 6]]) 
x[..., False] # same thing 

I valori booleani stanno specificando un indice, proprio come i numeri 0 o 1 sarebbe.


In risposta alla tua domanda nei commenti

possa sembrare prima magico che

a = np.array([[1, 2], [3, 4]]) 
a[..., [True, True]] # = [[2,2],[4,4]] 

Ma quando consideriamo come

a[..., [1,1]] # = [[2,2],[4,4]] 

sembra meno impressionante .

Analogamente:

b = array([[1,2,3],[4,5,6]]) 
b[...,[2,2]] # = [[3,3],[5,5]] 

Dopo l'applicazione delle regole puntini di sospensione; gli indici colonna afferrare vero e falso, proprio come 0, 1, o 17 avrebbe


array booleani indicizzazione Complex

Esistono alcune differenze sottili (bool sono un tipo diverso interi) . A lot of the hairy details can be found here. Questi non sembrano avere alcun passaggio nel tuo codice, ma sono interessanti nel capire come funziona l'indicizzazione numpy.

In particolare, questa linea è probabilmente quello che stai cercando:

In futuro array-calibro booleani (come ad esempio le liste di Caccio Python) sarà essere sempre trattati come indici booleani

On this page, parlano array booleani, che sono abbastanza complessi come uno strumento di indicizzazione

Gli array booleani utilizzati come indici sono trattati in modo diverso interamente rispetto agli array di indici.array booleani devono essere della stessa forma le dimensioni iniziali della matrice indicizzati

saltare giù un po

differenza nel caso di array indice intero, nel caso booleana, il risultato è un array 1-D contenente tutti gli elementi dell'array indicizzato corrispondente a tutti gli elementi veri dell'array booleano. Gli elementi nell'array indicizzato vengono sempre ripetuti e restituiti nell'ordine riga maggiore (stile C). Il risultato è identico allo y [np.nonzero (b)]. Come con gli array di indice, ciò che viene restituito è una copia di i dati, non una vista come si ottiene con le fette.

+0

Se questo è il caso, allora perché 'a [..., [True, True]] 'restituisce ' array ([[2, 2], [4, 4]]) ' – JRR

+0

@JRR scusate, non intendevo tagliare la risposta breve inviata troppo presto –

+0

@JRR potete confermare che a [..., [True, True]] valuti allo stesso modo di [..., [1, 1]], corretto? –