Tworzenie tablic
Tablica przechowuje wartości jednego typu w siatce o dowolnej liczbie wymiarów.
| Zadanie | Kod |
|---|
| Import NumPy | import numpy as np |
| Z listy | np.array([1, 2, 3]) |
| 2D z zagnieżdżonych list | np.array([[1, 2, 3], [4, 5, 6]]) |
| Zera, jedynki, jedna wartość | np.zeros((2, 3)), np.ones(4), np.full((2, 2), 7) |
| Zakres z krokiem (bez końca) | np.arange(0, 10, 2) # [0 2 4 6 8] |
| n równo rozłożonych punktów (z końcem) | np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] |
| Macierz jednostkowa | np.eye(3) |
| Ten sam kształt co inna tablica | np.zeros_like(m), np.ones_like(m) |
| Wybór typu elementów | np.array([1, 2, 3], dtype=np.float32) |
| Siatki współrzędnych | xx, yy = np.meshgrid(np.arange(3), np.arange(2)) |
Przeglądanie tablicy
| Zadanie | Kod |
|---|
| Kształt: rozmiar każdego wymiaru | m.shape # (3, 4) |
| Liczba wymiarów | m.ndim # 2 |
| Liczba elementów | m.size # 12 |
| Typ elementów | m.dtype # int64 |
| Zmiana typu | m.astype(np.float64) |
| Długość pierwszego wymiaru | len(m) # 3 |
| Z powrotem na listę Pythona | m.tolist() |
| Mniej miejsc po przecinku | np.set_printoptions(precision=3, suppress=True) |
Indeksowanie i wycinanie
Wycinki to widoki: współdzielą pamięć z oryginalną tablicą. Maski i listy indeksów zwracają kopie.
| Zadanie | Kod |
|---|
| Pierwszy i ostatni element | a[0], a[-1] |
| Wycinek start:stop (bez stop) | a[1:4] # [20 30 40] |
| Co drugi element, od tyłu | a[::2], a[::-1] |
| Jeden element tablicy 2D | m[1, 2] # 6 |
| Wiersz, kolumna | m[0], m[:, 1] |
| Blok wierszy i kolumn | m[:2, 1:3] |
| Elementy spełniające warunek | a[a > 25] # [30 40 50] |
| Łączenie warunków | a[(a > 15) & (a < 45)] |
| Wybór po liście pozycji | a[[0, 2, 4]] |
| Pozycje spełniające warunek | np.flatnonzero(a > 25) # [2 3 4] |
| Wybór dla każdego elementu | np.where(a > 25, a, 0) |
| Kopia przed zmianą wycinka | part = a[1:3].copy() |
| Ustawianie wartości maską | a[a > 40] = 0 |
Obliczenia i broadcasting
Operatory działają element po elemencie. Broadcasting rozciąga skalar, wiersz lub kolumnę do kształtu drugiej tablicy.
| Zadanie | Kod |
|---|
| Arytmetyka element po elemencie | x + y, x - y, x * y, x / y, x ** 2 |
| Ze skalarem | x * 10 |
| Pierwiastek, potęga e, logarytm | np.sqrt(x), np.exp(x), np.log(x) |
| Wartość bezwzględna, zaokrąglanie | np.abs(x - 5), np.round(x / 3, 2) |
| Ograniczenie do zakresu | np.clip(x, 2, 8) |
| Maksimum element po elemencie | np.maximum(x, 3) |
| Iloczyn skalarny | x @ y # 37.0 |
| Centrowanie kolumn (broadcasting wiersza) | m - m.mean(axis=0) |
| Skalowanie wierszy (broadcasting kolumny) | m / m.sum(axis=1, keepdims=True) |
| Bezpieczne porównanie floatów | np.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y) |
| Trygonometria i pi | np.sin(np.pi / 2) # 1.0 |
Agregacja wzdłuż osi
axis=0 idzie w dół po wierszach i daje jeden wynik na kolumnę. axis=1 idzie w poprzek kolumn i daje jeden wynik na wiersz.
| Zadanie | Kod |
|---|
| Suma wszystkich elementów | m.sum() # 21 |
| Jeden wynik na kolumnę | m.sum(axis=0) # [5 7 9] |
| Jeden wynik na wiersz | m.sum(axis=1) # [ 6 15] |
| Średnia i odchylenie standardowe | m.mean(), m.std(), m.mean(axis=0) |
| Minimum, maksimum | m.min(), m.max(axis=1) |
| Pozycja maksimum | m.argmax(), m.argmax(axis=1) |
| Mediana i percentyle | np.median(m), np.percentile(m, [25, 50, 75]) |
| Suma narastająca | np.cumsum(m, axis=1) |
| Iloczyn wszystkich elementów | m.prod() # 720 |
| Którykolwiek, wszystkie, liczba | (m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2) |
Zmiana kształtu i łączenie
Reshape zachowuje elementy i zmienia kształt, więc łączny rozmiar musi pozostać taki sam.
| Zadanie | Kod |
|---|
| Nowy kształt | a.reshape(2, 3) |
| Jeden wymiar wyliczy NumPy | a.reshape(3, -1), a.reshape(-1, 1) |
| Spłaszczenie do 1D | m.ravel(), m.flatten() |
| Transpozycja | m.T |
| Dodanie wymiaru | a[:, np.newaxis], np.expand_dims(a, axis=0) |
| Usunięcie wymiarów o rozmiarze 1 | np.squeeze(np.ones((1, 3, 1))) |
| Łączenie wzdłuż istniejącej osi | np.concatenate([a, a]) |
| Sklejanie wierszy lub kolumn | np.vstack([m, m]), np.hstack([m, m]) |
| Tablice 1D jako kolumny | np.column_stack([a, a ** 2]) |
| Sklejanie wzdłuż nowej osi | np.stack([a, a], axis=0) # shape (2, 6) |
| Podział na części | np.split(a, 3), np.array_split(a, 4) |
| Powtarzanie i kafelkowanie | np.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2] |
Sortowanie, wyszukiwanie i unikalne wartości
| Zadanie | Kod |
|---|
| Posortowana kopia | np.sort(a) |
| Od największych | np.sort(a)[::-1] |
| Pozycje dające posortowanie | np.argsort(a) |
| Trzy największe wartości | np.sort(a)[-3:] |
| Unikalne wartości i ich liczności | values, counts = np.unique(a, return_counts=True) |
Nazwy z NumPy 2 (unique_values może nie sortować) | np.unique_values(a), np.unique_counts(a) |
| Czy element jest na liście? | np.isin(a, [1, 9]) |
| Miejsce wstawienia w posortowanej tablicy | np.searchsorted([1, 3, 5, 7], 4) # 2 |
| Operacje na zbiorach | np.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1]) |
| Sortowanie wierszy po kolumnie | m[m[:, 1].argsort()] |
Liczby losowe
Utwórz jeden Generator z ziarnem i losuj wszystko z niego, a wyniki powtórzą się przy każdym uruchomieniu.
| Zadanie | Kod |
|---|
| Generator z ziarnem | rng = np.random.default_rng(42) |
| Floaty w [0, 1) | rng.random(3) |
| Liczby całkowite, bez górnej granicy | rng.integers(1, 7, size=10) |
| Rozkład normalny | rng.normal(loc=0, scale=1, size=(2, 3)) |
| Floaty jednostajne w zakresie | rng.uniform(5, 10, size=4) |
| Losowanie z listy | rng.choice(["a", "b", "c"], size=5) |
| Losowanie bez powtórzeń | rng.choice(10, size=3, replace=False) |
| Losowanie z wagami | rng.choice(["H", "T"], size=10, p=[0.7, 0.3]) |
| Przetasowana kopia, tasowanie w miejscu | rng.permutation(a), rng.shuffle(a) |
| Liczności z rozkładu dwumianowego i Poissona | rng.binomial(10, 0.5, size=5), rng.poisson(3, size=5) |
Algebra liniowa
| Zadanie | Kod |
|---|
| Iloczyn macierzy | A @ A |
| Rozwiąż Ax = b | np.linalg.solve(A, b) # [0.8 1.4] |
| Odwrotność i wyznacznik | np.linalg.inv(A), np.linalg.det(A) |
| Długość wektora | np.linalg.norm(b) |
| Wartości i wektory własne | values, vectors = np.linalg.eig(A) |
| Dopasowanie prostej | slope, intercept = np.polyfit(x, y, 1) |
| Iloczyn zewnętrzny | np.outer([1, 2], [3, 4]) |
| Przekątna i ślad | np.diag(A), np.trace(A) |
Braki i wartości specjalne
np.nan oznacza brakującego floata. Każde działanie z nim daje nan, więc używaj funkcji nan albo maski.
| Zadanie | Kod |
|---|
| Brakująca wartość | np.nan |
| Znajdź braki | np.isnan(v), np.isnan(v).sum() |
| Usuń braki | v[~np.isnan(v)] |
| Zamień braki i nieskończoności | np.nan_to_num(v, nan=0.0, posinf=0.0) |
| Sprawdzanie nieskończoności i skończoności | np.inf, np.isfinite(v) |
| Statystyki pomijające NaN | np.nanmean(v[:3]) # 2.0, np.nanmax(v) |
Zapis i odczyt
| Zadanie | Kod |
|---|
| Jedna tablica, plik binarny | np.save("data.npy", m), m = np.load("data.npy") |
| Kilka tablic w jednym pliku | np.savez("data.npz", x=x, y=y), np.load("data.npz")["x"] |
| Zapis tekstu CSV | np.savetxt("data.csv", m, delimiter=",", fmt="%d") |
| Odczyt tekstu CSV | np.loadtxt("data.csv", delimiter=",") |
NumPy 2: stare nazwy i co pisać teraz
NumPy 2 usunął wiele aliasów, więc kod skopiowany ze starszych tutoriali może rzucić AttributeError.
| Zadanie | NumPy 2 | Stary zapis |
|---|
| Brakująca wartość | np.nan | np.NaN |
| Nieskończoność | np.inf | np.Inf |
| Typ float 64-bitowy | np.float64 | np.float_ |
| Pole pod krzywą | np.trapezoid(y, x) | np.trapz(y, x) |
| Czy element jest w innej tablicy? | np.isin(a, b) | np.in1d(a, b) |
| Sklejanie wierszy | np.vstack([a, a]) | np.row_stack([a, a]) |
| Iloczyn | np.prod(a) | np.product(a) |
| Liczby losowe | rng = np.random.default_rng(0)
rng.random(3) | np.random.seed(0)
np.random.rand(3) |
Wywołania NumPy, na których stoi kod data science, pogrupowane według zadań: tworzenie tablic, ich przeglądanie, indeksowanie i wycinanie, obliczenia element po elemencie, agregacja wzdłuż osi, zmiana kształtu i łączenie, sortowanie i wyszukiwanie, losowanie liczb oraz algebra liniowa. Każdy wiersz to krótki fragment kodu do wklejenia i jedno zdanie o tym, co robi.
Wszystko tutaj jest napisane dla NumPy 2, wersji, której używa Coddy, a ostatnia tabela pokazuje nazwy usunięte w NumPy 2 obok tego, co pisać zamiast nich. Większość przykładów używa a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) i m = np.arange(12).reshape(3, 4). Dopiero zaczynasz z Pythonem? Zajrzyj do ściągi z Pythona i Python playground, a obok tej ściągi trzymaj też ściągi z pandas, Matplotlib i scikit-learn.