0Pricing
Pandas & NumPy Academy · Lezione

Mascheramento booleano e indicizzazione avanzata

Filtri gli array con condizioni booleane e selezioni elementi arbitrari usando array di indici interi.

Mascheramento booleano e indicizzazione avanzata è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Array booleani come maschere

Una maschera booleana è un array di valori True/False. Usandola come indice, conserva solo gli elementi contrassegnati da True: è il principale strumento per filtrare i dati.

import numpy as np

a = np.array([5, 3, 8, 1, 9, 2, 7])
mask = a > 4
print(mask)       # [ True False  True False  True False  True]
print(a[mask])    # [5 8 9 7]

Condizioni booleane composte

Costruisca filtri composti con & (and), | (or) e ~ (not). Racchiuda sempre ogni condizione tra parentesi, altrimenti la precedenza degli operatori può causare problemi.

import numpy as np

a = np.array([3, 7, 2, 9, 1, 6, 4, 8])

# Elements between 4 and 8 inclusive
result = a[(a >= 4) & (a <= 8)]
print(result)   # [7 6 4 8]

# Elements less than 3 or greater than 7
result2 = a[(a < 3) | (a > 7)]
print(result2)  # [2 9 1 8]

Modificare i valori con l'indicizzazione booleana

Può assegnare direttamente a una selezione booleana, modificando sul posto solo gli elementi corrispondenti. È il modo più rapido per limitare i valori anomali o inserire valori mancanti.

import numpy as np

a = np.array([5, -3, 8, -1, 2, -7])
a[a < 0] = 0    # zero out negatives in-place
print(a)        # [5 0 8 0 2 0]

# Cap values above 6
a[a > 6] = 6
print(a)        # [5 0 6 0 2 0]

Mascheramento booleano su array bidimensionali

Una maschera booleana applicata a un array bidimensionale restituisce sempre un risultato unidimensionale appiattito. Per selezionare righe intere, costruisca una maschera unidimensionale a partire da una colonna e indicizzi lungo axis 0.

import numpy as np

m = np.array([[1, 5], [3, 2], [8, 4], [6, 7]])
# Select rows where first column > 4
mask = m[:, 0] > 4
print(mask)     # [False False  True  True]
print(m[mask])  # [[8 4] [6 7]]

np.where con le maschere

np.where(condition, x, y) conserva la forma dell'array: sceglie x dove la condizione è verificata e y negli altri casi. È perfetto per sostituire valori senza appiattire l'array.

import numpy as np

a = np.array([3, -1, 5, -2, 4])
result = np.where(a >= 0, a, 0)  # keep positives, replace negatives
print(result)  # [3 0 5 0 4]

# Recode: above-average -> 'high', else -> 'low'
labels = np.where(a >= a.mean(), 'high', 'low')
print(labels)  # ['high' 'low' 'high' 'low' 'high']

Nozioni di base sull'indicizzazione avanzata

L'indicizzazione avanzata consiste nel passare un array di indici interi per recuperare elementi specifici, in qualsiasi ordine e anche con ripetizioni. Restituisce sempre una copia.

import numpy as np

a = np.array([10, 20, 30, 40, 50])
idx = np.array([4, 1, 1, 3])
print(a[idx])   # [50 20 20 40]

# 2D index shape -> 2D output
idx2d = np.array([[0, 2], [4, 1]])
print(a[idx2d])  # [[10 30] [50 20]]

Indicizzazione avanzata su array bidimensionali

Su un array bidimensionale, gli array di indici abbinati selezionano punti sparsi: m[rows, cols] recupera l'elemento di ogni coppia (riga, colonna), non un'intera sottomatrice.

import numpy as np

m = np.array([[1,  2,  3],
              [4,  5,  6],
              [7,  8,  9]])

# Select elements at (0,2), (1,0), (2,1)
rows = [0, 1, 2]
cols = [2, 0, 1]
print(m[rows, cols])  # [3 4 8]

np.ix_ per selezionare una griglia di righe e colonne

np.ix_ seleziona una sottomatrice per ogni combinazione delle righe e delle colonne indicate: è utile quando vuole selezionare molte righe E molte colonne, non solo coppie.

import numpy as np

m = np.arange(16).reshape(4, 4)
print(m)

# Select rows 0,2 and columns 1,3
ix = np.ix_([0, 2], [1, 3])
print(m[ix])
# [[ 1  3]
#  [ 9 11]]

np.nonzero() e np.argwhere()

np.nonzero restituisce gli indici degli elementi diversi da zero (o True) come una tupla per ogni asse. np.argwhere fornisce le stesse informazioni impilate in righe facili da leggere.

import numpy as np

a = np.array([0, 3, 0, 5, 0, 7])
print(np.nonzero(a))       # (array([1, 3, 5]),)
print(np.argwhere(a > 0))  # [[1] [3] [5]]

Combinare indicizzazione booleana e avanzata

Le combini: usi una maschera booleana per filtrare le righe, quindi l'indicizzazione avanzata per riordinare le colonne. Insieme consentono di filtrare e riorganizzare i dati in un unico passaggio chiaro.

import numpy as np

data = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])
scores = np.array([0.9, 0.3, 0.8])

# Keep high-scoring rows, reorder columns to [2, 0, 1]
high = data[scores > 0.5]
reordered = high[:, [2, 0, 1]]
print(reordered)

Prestazioni: indicizzazione booleana o avanzata

Sia l'indicizzazione booleana sia quella avanzata restituiscono copie. Per filtrare, una maschera booleana è generalmente la soluzione più leggibile e offre prestazioni più che sufficienti: un'ottima scelta predefinita.

import numpy as np

a = np.random.rand(1_000_000)

# Boolean mask -- readable and fast
result = a[a > 0.5]
print('filtered size:', result.size)  # ~500000

# Equivalent with np.where + fancy index
idx = np.where(a > 0.5)[0]
result2 = a[idx]
print('same result:', np.array_equal(result, result2))

Verifica rapida

Verifichi la Sua comprensione del mascheramento booleano e dell'indicizzazione avanzata presentati in questa lezione.

Riepilogo della lezione

Ben fatto! Le maschere booleane filtrano e copiano, np.where conserva la forma dell'array e l'indicizzazione avanzata recupera gli elementi specificati. Prossimo argomento: le Series di Pandas.

Domande Frequenti

La lezione «Mascheramento booleano e indicizzazione avanzata» è gratuita?

Sì — il testo completo di «Mascheramento booleano e indicizzazione avanzata» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Cosa imparerò in «Mascheramento booleano e indicizzazione avanzata»?

Filtri gli array con condizioni booleane e selezioni elementi arbitrari usando array di indici interi. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?

Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Mascheramento booleano e indicizzazione avanzata»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?

Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni universali (ufunc)
  2. Funzioni di aggregazione
  3. Regole di broadcasting
  4. Mascheramento booleano e indicizzazione avanzata
← Torna a Pandas & NumPy Academy