Pandas & NumPy Academy · Lekcja

Zasady broadcastingu

Rozumieć zasady broadcastingu w NumPy, aby dodawać tablicę 1D do każdego wiersza tablicy 2D bez jawnego powielania

Lekcja 3 z 413 kroki

Zasady broadcastingu to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 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.

Problem rozwiązywany przez broadcasting

Broadcasting pozwala NumPy łączyć tablice o różnych, ale zgodnych kształtach bez kopiowania danych — mniejsza tablica jest rozciągana, aby dopasować się do większej.

import numpy as np

# Adding a scalar to an array is the simplest broadcast
a = np.array([1, 2, 3])
print(a + 10)  # [11 12 13]
# Scalar 10 is 'broadcast' to shape (3,)

Reguła broadcastingu 1: dodawanie jedynek z lewej

NumPy dopasowuje kształty, zaczynając od prawej strony. Jeśli jedna tablica ma mniej wymiarów, uzupełnia jej lewą stronę jedynkami — dlatego tablica (3,) zachowuje się jak (1, 3) obok tablicy (4, 3).

import numpy as np

m = np.ones((4, 3))
v = np.array([10, 20, 30])  # shape (3,) -> treated as (1, 3)

result = m + v   # shape (4, 3)
print(result)
# [[11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]]

Reguła broadcastingu 2: rozciąganie wymiarów o rozmiarze 1

Każdy wymiar o rozmiarze 1 może zostać rozciągnięty, aby dopasować się do drugiej tablicy — dane nie są przy tym kopiowane. Obie tablice mogą jednocześnie rozciągać swoje wymiary o rozmiarze 1.

import numpy as np

# (3, 1) + (1, 4)  -->  (3, 4)
col = np.array([[1], [2], [3]])    # shape (3, 1)
row = np.array([[10, 20, 30, 40]]) # shape (1, 4)
print((col + row).shape)  # (3, 4)
print(col + row)

Reguła broadcastingu 3: niezgodne kształty

Jeśli dwa wymiary nie są równe i żaden z nich nie ma wartości 1, broadcasting kończy się błędem ValueError. Sprawdzenie kształtów wcześniej pozwala uzyskać jasny błąd zamiast trudnego do wykrycia problemu.

import numpy as np

a = np.ones(3)
b = np.ones(4)
try:
    a + b
except ValueError as e:
    print(e)
# operands could not be broadcast together with shapes (3,) (4,)

Praktyka: odejmowanie średniej kolumny

Klasyczna operacja: odjęcie średniej każdej kolumny od wszystkich wierszy w celu wycentrowania danych. Dzięki keepdims=True średnia zachowuje kształt, który można bez problemu wykorzystać w broadcastingu.

import numpy as np

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

col_mean = data.mean(axis=0)          # shape (3,)
centred = data - col_mean             # broadcast along axis 0
print(centred)
# [[-3. -3. -3.]
#  [ 0.  0.  0.]
#  [ 3.  3.  3.]]

Praktyka: normalizacja wierszy

Aby suma każdego wiersza wynosiła 1, podziel go przez sumę jego elementów. Użyj keepdims=True, aby suma zachowała kształt (n, 1) i została rozgłoszona wzdłuż kolumn.

import numpy as np

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

row_sums = m.sum(axis=1, keepdims=True)  # shape (2, 1)
normed = m / row_sums
print(normed.round(3))
# [[0.167 0.333 0.5  ]
#  [0.267 0.333 0.4  ]]

Iloczyny zewnętrzne za pomocą broadcastingu

Zmień kształt jednej tablicy na (n, 1), a drugiej na (1, m), a następnie je pomnóż — broadcasting utworzy za Ciebie pełną macierz iloczynu zewnętrznego, bez używania pętli.

import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20, 30, 40])

outer = a[:, np.newaxis] * b[np.newaxis, :]
print(outer)
# [[ 10  20  30  40]
#  [ 20  40  60  80]
#  [ 30  60  90 120]]

Broadcasting z tablicami 3-wymiarowymi

Broadcasting działa dla dowolnej liczby wymiarów. Partię obrazów o kształcie (100, 28, 28) można wycentrować za pomocą średniej dla każdego piksela o kształcie (1, 28, 28) — NumPy rozciągnie wymiar o rozmiarze 1.

import numpy as np

batch = np.random.rand(100, 28, 28)  # 100 images
pixel_mean = batch.mean(axis=0, keepdims=True)  # (1, 28, 28)
centred = batch - pixel_mean          # (100, 28, 28)
print(centred.shape)  # (100, 28, 28)

np.broadcast_to do jawnego rozciągania

np.broadcast_to pokazuje dokładnie wynik broadcastingu jako widok tylko do odczytu, bez kopiowania danych. Doskonale nadaje się do wyobrażenia sobie, jak dopasowują się kształty.

import numpy as np

a = np.array([1, 2, 3])
view = np.broadcast_to(a, (4, 3))
print(view)
# [[1 2 3]
#  [1 2 3]
#  [1 2 3]
#  [1 2 3]]
print(view.flags.writeable)  # False

Wizualizacja zgodnych kształtów

Przydatna zasada: dopasuj kształty, zaczynając od prawej strony, i sprawdź każdą parę. Są zgodne, jeśli są równe lub jeden z nich ma wartość 1. Przewiduj kształty przed uruchomieniem kodu!

# Shape compatibility examples:
# (3, 4) + (   4) -> (3, 4)  OK: 4==4, 1 implied
# (3, 4) + (3, 1) -> (3, 4)  OK: 4 vs 1, 3==3
# (2, 3, 4) + (3, 4) -> (2, 3, 4)  OK
# (3, 4) + (3,  ) -> ERROR: 4 vs 3
import numpy as np
print(np.zeros((3,4)).shape)       # (3, 4)
print((np.zeros((3,4)) + np.zeros(4)).shape)  # (3, 4)

Typowe błędy związane z broadcastingiem

Najczęstszy błąd w broadcastingu to pominięcie keepdims=True po agregacji, przez co kształty przestają do siebie pasować. W razie wątpliwości wyświetl print(arr.shape), aby zobaczyć, co naprawdę się dzieje.

import numpy as np

m = np.arange(6).reshape(2, 3)
row_max = m.max(axis=1)            # shape (2,)  NOT (2,1)
print(row_max.shape)               # (2,)
# m - row_max  -> ERROR: shapes (2,3) and (2,) misalign

row_max_col = row_max[:, np.newaxis]  # shape (2, 1)
print((m - row_max_col).shape)     # (2, 3)  OK

Szybkie sprawdzenie

Sprawdź swoją znajomość reguł broadcastingu NumPy z tej lekcji.

Podsumowanie lekcji

Doskonale! Broadcasting rozciąga wymiary o rozmiarze 1, porównuje kształty od prawej strony, a keepdims=True zachowuje osie, dzięki czemu działania są zgodne. Dalej: maskowanie boolowskie.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Zasady broadcastingu” jest bezpłatna?

Tak — pełny tekst „Zasady broadcastingu” 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 „Zasady broadcastingu”?

Rozumieć zasady broadcastingu w NumPy, aby dodawać tablicę 1D do każdego wiersza tablicy 2D bez jawnego powielania Ć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 3 z 4.

Ile czasu zajmuje lekcja „Zasady broadcastingu”?

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