
In Python, puoi slice [start:stop:] per selezionare una parte da utilizzare per un oggetto sequenza, come un elenco, una stringa o unapla per ottenere un valore o utilizzare un oggetto step.
È anche possibile selezionare un sottoarray tagliando per un’array NumPy numpy.ndarray ed estrarre un valore o assegnare un altro valore.
Questo articolo descrive quanto segue:
- Nozioni di base sul taglio
- Settore per numpy.one-dimensional darray
- Slice per numpy.ndarray multidimensionale
- recensioni e copia
- Con elegante indicizzazione
Vedere l’articolo seguente per informazioni su come estrarre righe e colonne che soddisfano le condizioni.
Nozioni di base sul taglio
In Python, puoi slice [start:stop:] per selezionare una parte da utilizzare per un oggetto sequenza, come un elenco, una stringa o unapla per ottenere un valore o utilizzare un oggetto step.
import numpy as np
l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(l[4:8])
# [4, 5, 6, 7]
print(l[-5:-2])
# [5, 6, 7]
print(l[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Affettare è una funzione standard in Python. Per ulteriori informazioni, vedere il seguente articolo.
Settore per numpy.one-dimensional darray
Ottieni un sottoarray
Il segmento per numpy.ndarray unidimensionale è lo stesso del segmento Python di base come nell’esempio sopra.
a = np.arange(10)
print(a)
# [0 1 2 3 4 5 6 7 8 9]
print(a[4:8])
# [4 5 6 7]
print(a[-5:-2])
# [5 6 7]
print(a[::-1])
# [9 8 7 6 5 4 3 2 1 0]
Assegna un altro valore
Il comportamento dell’assegnazione del segmento è diverso per list e numpy.ndarray.
Vedere il seguente articolo per vedere l’allocazione all’elenco per settore. Il numero di elementi selezionati per la sezione e il numero di elementi da allocare non devono corrispondere.
In numpy.ndarray, il valore sul lato destro viene convertito in streaming e assegnato.
Se il lato destro è un valore scalare, tutti gli elementi selezionati dal segmento verranno sostituiti con quel valore scalare. Se il lato destro è un array unidimensionale, verrà sostituito con quell’array.
a[3:6] = 100
print(a)
# [ 0 1 2 100 100 100 6 7 8 9]
a[3:6] = [100, 200, 300]
print(a)
# [ 0 1 2 100 200 300 6 7 8 9]
Quando si alloca una matrice, se il numero di elementi nella matrice da allocare e il numero di elementi selezionati nella sezione non corrispondente, viene generato un ValueError.
# a[3:6] = [100, 200, 300, 400]
# ValueError: cannot copy sequence with size 4 to array axis with dimension 3
Lo stesso vale per i settori per i quali è specificato il passo.
a = np.arange(10)
print(a)
# [0 1 2 3 4 5 6 7 8 9]
print(a[2:8:2])
# [2 4 6]
a[2:8:2] = 100
print(a)
# [ 0 1 100 3 100 5 100 7 8 9]
a[2:8:2] = [100, 200, 300]
print(a)
# [ 0 1 100 3 200 5 300 7 8 9]
Slice per numpy.ndarray multidimensionale
Per numpy.ndarray multidimensionale, le porzioni di ciascuna dimensione possono essere specificate separate da virgole.
Prendi come esempio il seguente array bidimensionale.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
Prendi un sottoarray
Specifica le sezioni per ogni dimensione separate da gole.
print(a[1:, 1:3])
# [[ 5 6]
# [ 9 10]]
seleziona le righe
Puoi selezionare le righe usando :. In questo caso, la desinenza: può essere omessa.
print(a[1:, :])
# [[ 4 5 6 7]
# [ 8 9 10 11]]
print(a[1:])
# [[ 4 5 6 7]
# [ 8 9 10 11]]
Quando si seleziona una riga, se si specifica l’indice in base al valore scalare anziché al segmento, verrà selezionata come matrice unidimensionale, ma se si seleziona una riga in base al segmento, verrà selezionata come matrice bidimensionale .
print(a[1])
# [4 5 6 7]
print(a[1].shape)
# (4,)
print(a[1:2])
# [[4 5 6 7]]
print(a[1:2].shape)
# (1, 4)
Fai attenzione nei casi in cui la forma è importante, come le operazioni sulle matrici.
Seleziona colonne
Lo stesso vale per la selezione delle colonne. In questo caso, il primo: non può essere omesso.
print(a[:, 1:3])
# [[ 1 2]
# [ 5 6]
# [ 9 10]]
print(a[:, 1])
# [1 5 9]
print(a[:, 1].shape)
# (3,)
print(a[:, 1:2])
# [[1]
# [5]
# [9]]
print(a[:, 1:2].shape)
# (3, 1)
Puoi usare… se : si ripete. Vedi il seguente articolo.
Assegna un altro valore
Come nel caso di un numpy.ndarray unidimensionale, nell’assegnazione a un numpy.ndarray multidimensionale, il valore sul lato destro viene lanciato e assegnato.
Quando si alloca una matrice, viene generato un errore se il numero di elementi della matrice allocare e il numero di elementi selezionati dalla sezione non deve corrispondere.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[1:, 1:3])
# [[ 5 6]
# [ 9 10]]
a[1:, 1:3] = 100
print(a)
# [[ 0 1 2 3]
# [ 4 100 100 7]
# [ 8 100 100 11]]
a[1:, 1:3] = [100, 200]
print(a)
# [[ 0 1 2 3]
# [ 4 100 200 7]
# [ 8 100 200 11]]
a[1:, 1:3] = [[100, 200], [300, 400]]
print(a)
# [[ 0 1 2 3]
# [ 4 100 200 7]
# [ 8 300 400 11]]
Lo stesso vale per i settori per i quali è specificato il passo.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[1:, ::2])
# [[ 4 6]
# [ 8 10]]
a[1:, ::2] = 100
print(a)
# [[ 0 1 2 3]
# [100 5 100 7]
# [100 9 100 11]]
a[1:, ::2] = [100, 200]
print(a)
# [[ 0 1 2 3]
# [100 5 200 7]
# [100 9 200 11]]
a[1:, ::2] = [[100, 200], [300, 400]]
print(a)
# [[ 0 1 2 3]
# [100 5 200 7]
# [300 9 400 11]]
recensioni e copia
Il sottoarray estratto dalla sezione è una vista dell’array originale e la modifica degli elementi del sottoarray cambia anche gli elementi dell’array originale.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
a_slice = a[1:, 1:3]
print(a_slice)
# [[ 5 6]
# [ 9 10]]
a_slice[0, 0] = 100
print(a_slice)
# [[100 6]
# [ 9 10]]
print(a)
# [[ 0 1 2 3]
# [ 4 100 6 7]
# [ 8 9 10 11]]
Puoi fare una copia di un sottoarray usando copy(). La modifica degli elementi della copia non modifica gli elementi dell’array originale.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
a_slice_copy = a[1:, 1:3].copy()
print(a_slice_copy)
# [[ 5 6]
# [ 9 10]]
a_slice_copy[0, 0] = 100
print(a_slice_copy)
# [[100 6]
# [ 9 10]]
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
Vedere il seguente articolo per ulteriori informazioni sulle recensioni e sulle copie in numpy.ndarray.
Con elegante indicizzazione
In NumPy, puoi selezionare un sottoarray di numpy.ndarray usando un elenco di indici.
I sotto-array possono essere selezionati combinando sofisticati indicizzazione e taglio.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[[0, 2], 1:3])
# [[ 1 2]
# [ 9 10]]
a[[0, 2], 1:3] = 100
print(a)
# [[ 0 100 100 3]
# [ 4 5 6 7]
# [ 8 100 100 11]]
a[[0, 2], 1:3] = [100, 200]
print(a)
# [[ 0 100 200 3]
# [ 4 5 6 7]
# [ 8 100 200 11]]
a[[0, 2], 1:3] = [[100, 200], [300, 400]]
print(a)
# [[ 0 100 200 3]
# [ 4 5 6 7]
# [ 8 300 400 11]]
Si noti che il sottoarray estratto dall’indicizzazione elegante è una copia, non una vista.
a_subset = a[[0, 2], 1:3]
print(a_subset)
# [[100 200]
# [300 400]]
a_subset[0, 0] = -1
print(a_subset)
# [[ -1 200]
# [300 400]]
print(a)
# [[ 0 100 200 3]
# [ 4 5 6 7]
# [ 8 300 400 11]]