0Pricing
Pandas & NumPy Academy · Lekcja

Maskowanie boolowskie i zaawansowane indeksowanie

Filtrować tablice za pomocą warunków boolowskich i wybierać dowolne elementy przy użyciu tablic indeksów całkowitych

Maskowanie boolowskie i zaawansowane indeksowanie to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Tablice boolowskie jako maski

Maska boolowska to tablica wartości True/False. Użyj jej jako indeksu, aby zachować tylko elementy oznaczone wartością True — to podstawowe narzędzie filtrowania.

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]

Złożone warunki boolowskie

Twórz złożone filtry za pomocą & (i), | (lub) oraz ~ (nie). Zawsze ujmuj każdy warunek w nawiasy, w przeciwnym razie kolejność operatorów może spowodować problemy.

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]

Modyfikowanie wartości za pomocą indeksowania boolowskiego

Możesz przypisać wartość bezpośrednio do wyboru boolowskiego, zmieniając w miejscu tylko pasujące elementy. To najszybszy sposób na ograniczenie wartości odstających lub uzupełnienie brakujących wartości.

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]

Maskowanie boolowskie tablic 2-wymiarowych

Maska boolowska zastosowana do tablicy 2-wymiarowej zawsze zwraca spłaszczony wynik 1-wymiarowy. Aby wybrać całe wiersze, utwórz maskę 1-wymiarową na podstawie jednej kolumny i indeksuj wzdłuż osi 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 z maskami

np.where(condition, x, y) zachowuje kształt tablicy: wybiera x tam, gdzie warunek jest spełniony, a w pozostałych miejscach y. To idealne rozwiązanie do zamiany wartości bez spłaszczania tablicy.

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']

Podstawy zaawansowanego indeksowania

Zaawansowane indeksowanie polega na przekazaniu tablicy indeksów całkowitoliczbowych w celu wybrania konkretnych elementów — w dowolnej kolejności i z powtórzeniami. Zawsze zwraca kopię.

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]]

Zaawansowane indeksowanie tablic 2-wymiarowych

W tablicy 2-wymiarowej pary tablic indeksów wybierają rozproszone punkty: m[rows, cols] pobiera element z każdej pary (wiersz, kolumna), a nie całą podmacierz.

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_ do wyboru siatki wierszy i kolumn

np.ix_ wybiera podmacierz dla każdej kombinacji wskazanych wierszy i kolumn — przydatne, gdy chcesz wybrać wiele wierszy ORAZ wiele kolumn, a nie tylko pary.

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() i np.argwhere()

np.nonzero zwraca indeksy elementów niezerowych (lub mających wartość True) jako krotkę dla każdej osi. np.argwhere zwraca te same informacje ułożone w łatwych do odczytania wierszach.

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]]

Łączenie indeksowania boolowskiego i zaawansowanego

Połącz oba podejścia: użyj maski boolowskiej do odfiltrowania wierszy, a następnie zaawansowanego indeksowania do zmiany kolejności kolumn. Razem pozwalają w jednym przejrzystym kroku filtrować i porządkować dane.

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)

Wydajność: indeksowanie boolowskie a zaawansowane

Zarówno indeksowanie boolowskie, jak i zaawansowane zwraca kopie. Do filtrowania maska boolowska jest zwykle najbardziej czytelna i wystarczająco szybka — to dobry wybór domyślny.

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))

Szybkie sprawdzenie

Sprawdź swoją znajomość maskowania boolowskiego i zaawansowanego indeksowania z tej lekcji.

Podsumowanie lekcji

Dobra robota! Maski boolowskie filtrują i kopiują, np.where zachowuje kształt tablicy, a zaawansowane indeksowanie pobiera dowolne wskazane elementy. Dalej: Series w Pandas!

Często zadawane pytania

Czy lekcja „Maskowanie boolowskie i zaawansowane indeksowanie” jest bezpłatna?

Tak — pełny tekst „Maskowanie boolowskie i zaawansowane indeksowanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Maskowanie boolowskie i zaawansowane indeksowanie”?

Filtrować tablice za pomocą warunków boolowskich i wybierać dowolne elementy przy użyciu tablic indeksów całkowitych Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Maskowanie boolowskie i zaawansowane indeksowanie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje uniwersalne (ufuncs)
  2. Funkcje agregujące
  3. Zasady broadcastingu
  4. Maskowanie boolowskie i zaawansowane indeksowanie
← Powrót do Pandas & NumPy Academy