2010-04-27 16 views
11

mi hanno una serie come:array affettare in NumPy/SciPy

a = array([[1,2,3],[3,4,5],[4,5,6]]) 

qual è il modo più efficace per tagliare fuori una matrice 1x2 da questo che ha solo le prime due colonne di "a"?

cioè

array([[2,3],[4,5],[5,6]]) in this case. 

grazie.

+3

Come è il risultato dell'esempio nel tuo Q "1x2" ...? E come ha il _prima_ due colonne? Devo essere confuso ... –

+2

@Alex: vedendo i risultati mi aspetto che intendesse le ultime due colonne :) E 1x2 ... beh. Ci sono 3 matrici di 2 elementi, puoi vederlo così;) Hai completamente ragione, +1 – Wolph

+0

sì, penso che sia stato un refuso. risolto – mithunpaul

risposta

18

Due matrici NumPy dimensionali sono indicizzate usando a[i,j] (non a[i][j]), ma è possibile utilizzare la stessa notazione affettare con gli array NumPy e matrici come si può con le matrici comuni in pitone (basta metterli in un unico []) :

 
>>> from numpy import array 
>>> a = array([[1,2,3],[3,4,5],[4,5,6]]) 
>>> a[:,1:] 
array([[2, 3], 
     [4, 5], 
     [5, 6]]) 
+0

Questa regola si applica solo agli array 2-dimensionali? –

+0

@IvanBalashov No, puoi usarlo anche per le quote più alte. – Demento

4

È questo quello che stai cercando?

a[:,1:] 
1

in altre parole (per citare documentation) la sintassi slice di base è i: j: k dove i è l'indice iniziale, j è l'indice di arresto, e k è il passo (k> 0)

Ora se "i" non viene assegnato, il valore predefinito è 0 per k> 0 e n - 1 per k < 0. Se j non viene assegnato, il valore predefinito è n.

Questo è un array monodimensionale. Ora gli array bidimensionali sono una bestia diversa. La sintassi di slicing è un [rowrange, columnrange]

Quindi se si desidera tutte le righe, ma solo le ultime due colonne, come nel caso, si fa a [0: 3,1: 3].

Qui [0: 3] indica tutte le righe da 0 a 3. e [1: 3] significa tutte le colonne dalla colonna 1 alla colonna 3.

Ora, come ci si potrebbe chiedere, anche se hai solo 3 colonne e la numerazione inizia da 1, quindi tecnicamente questo comando deve restituire 3 colonne a destra. i.e colonna 1, colonna2, colonna 3. Questa è la parte difficile di questa sintassi. Devi iniziare a contare da DOPO il primo numero. Quindi quando dici [1: 3], in realtà stai dicendo dammi colonna 2 e colonna 3. Quali sono le ultime due colonne che vuoi.

Ora se non sai per quanto tempo è la tua matrice o se vuoi tutte le righe, puoi semplicemente lasciare quella parte vuota.

a [:, 1: 3] funzionerà anche.

Lo stesso vale anche per le colonne. vale a dire se si voleva dire, tutte le colonne, ma solo la prima fila, si può scrivere

a [0: 1 ,:]

Ora, come il sopra risposta [:, 1:] funziona è perché quando dici [1:] per colonne, significa darmi qualcosa DOPO la prima colonna e fino alla fine di tutte le colonne. Vuoto significa 'fino alla fine'.

Ormai è necessario rendersi conto che qualsiasi cosa su entrambi i lati della virgola è tutto un sottoinsieme del caso unidimensionale che ho menzionato prima. io.e se si desidera specificare le righe utilizzando formati passo è possibile scrivere un [:: 2,1]

che nel tuo caso tornerà array ([[2, 3], [5, 6]]

ie il comando chiarisce come: dammi tutte le righe, prendendo 2 alla volta. Inoltre dammi solo le ultime 2 colonne.

Questo mi ha richiesto un po 'di tempo per capire. Quindi incollalo qui, nel caso in cui aiuti qualcuno.