2013-06-24 17 views
25

Sono nuovo di Python e Numpy. Ho scoperto come tagliare 1 dimensione: arr[atart:end] e accedere a un elemento dell'array: el = arr[row][col].Python: slicing di un array multidimensionale

Cercando qualcosa di simile slice = arr[0:2][0:2] (dove arr è una matrice NumPy) non mi dà le prime 2 righe e colonne, ma ripete le prime 2 righe. Cosa ho fatto e come affetto un'altra dimensione?

+0

Quale tipo di dati è 'arr'? È una lista di liste? – mgilson

+0

@mgilson Ho aggiornato il tipo nella domanda – SlightlyCuban

risposta

33

Se si utilizza numpy, questo è facile:

slice = arr[:2,:2] 

o se si desidera che le 0 di,

slice = arr[0:2,0:2] 

si otterrà lo stesso risultato.

* nota che slice è in realtà il nome di un tipo incorporato. In generale, consiglierei di dare al tuo oggetto un "nome" diverso.


Un altro modo, se si sta lavorando con le liste di liste *:

slice = [arr[i][0:2] for i in range(0,2)] 

(Si noti che il 0 di qui sono inutili:. [arr[i][:2] for i in range(2)] sarebbe anche lavorare).

Quello che ho fatto è che prendo ogni riga desiderata 1 alla volta (arr[i]). Quindi affondo le colonne che voglio da quella riga e la aggiungo alla lista che sto costruendo.

Se si tenta ingenuamente: arr[0:2] Si ottengono le prime 2 righe che se si taglia nuovamente arr[0:2][0:2], si stanno solo tagliando nuovamente le prime due righe.

* Questo in realtà funziona anche per gli array numpy, ma sarà lento rispetto alla soluzione "nativa" che ho postato sopra.

+0

Quindi, cosa fa "arr [0: 2] [0: 2]' effettivamente fare rispetto a 'arr [row] [col] '? – SlightlyCuban

+0

@SlightlyCuban - Vedi la mia risposta aggiornata. – mgilson

+0

@mgilson Mi sono stancato e ho ottenuto un risultato piuttosto strano. Supponiamo di avere 'a = [[1,2,3], [4,5,6], [7,8,9]]' poi 'a [0] [:] = [1, 2, 3]' ma stranamente 'a [:] [0]' è ancora '[1,2,3]'. Direi che questo dovrebbe essere '[1,4,7]'. Apprezzerei se potessi dirmi cosa c'è che non va qui. –