Pandas & NumPy Academy · leksjon

Regler for broadcasting

Forstå NumPys regler for broadcasting, slik at De kan legge en 1D-tabell til hver rad i en 2D-tabell uten eksplisitt replikering.

Leksjon 3 av 413 trinn

Regler for broadcasting er en gratis leksjon i Pandas & NumPy Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Pandas & NumPy Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Pandas & NumPy Academy inneholder totalt 4 leksjoner.

Problemet kringkasting løser

Kringkasting lar NumPy kombinere arrayer med ulike, men kompatible former uten å kopiere data – den minste arrayen strekkes for å passe til den største.

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

Kringkastingsregel 1: Legg til 1-er først

NumPy justerer former fra høyre. Hvis én array har færre dimensjoner, fylles venstresiden med 1-er – derfor oppfører en array med form (3,) seg som (1, 3) ved siden av en med form (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.]]

Kringkastingsregel 2: Strekk dimensjoner med størrelse 1

Alle dimensjoner med størrelse 1 kan strekkes for å passe til den andre arrayen – dataene kopieres faktisk ikke. Begge arrayene kan strekke dimensjonene sine med størrelse 1 samtidig.

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)

Kringkastingsregel 3: Inkompatible former

Hvis to dimensjoner ikke er like og ingen av dem er 1, mislykkes kringkastingen med en ValueError. Ved å kontrollere formene først får De en tydelig feil i stedet for en skjult feil.

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

Praktisk: Trekk fra kolonnens gjennomsnitt

Et klassisk grep er å trekke gjennomsnittet for hver kolonne fra hver rad for å sentrere dataene. Med keepdims=True beholder gjennomsnittet en form som kringkastes uten problemer.

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

Praktisk: Normalisering av rader

For å få summen av hver rad til å bli 1 deler De på radsummen. Bruk keepdims=True, slik at summen beholder formen (n, 1) og kringkastes på tvers av kolonnene.

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

Ytre produkter med kringkasting

Endre formen på én array til (n, 1) og en annen til (1, m), og multipliser dem deretter – kringkasting bygger hele matrisen for det ytre produktet for Dem, uten behov for løkker.

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

Kringkasting med 3D-arrayer

Kringkasting fungerer med alle dimensjoner. En bildesamling med formen (100, 28, 28) kan sentreres med et gjennomsnitt per piksel med formen (1, 28, 28) – NumPy strekker 1-eren.

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 for eksplisitt strekking

np.broadcast_to viser nøyaktig hva en kringkasting produserer, som en skrivebeskyttet visning uten kopiering. Den er perfekt for å se hvordan formene justeres.

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

Visualisering av kompatible former

En nyttig regel er å justere formene fra høyre og kontrollere hvert par. De er kompatible hvis de er like eller én av dem er 1. Forutse formene før De kjører koden!

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

Vanlige kringkastingsfeil

Den vanligste kringkastingsfeilen er å glemme keepdims=True etter en aggregering, slik at formene ikke passer sammen. Når De står fast, kan De skrive ut arr.shape for å se hva som faktisk skjer.

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

Hurtigsjekk

Test forståelsen Deres av NumPy-reglene for kringkasting fra denne leksjonen.

Oppsummering av leksjonen

Dette har De fått til! Kringkasting strekker dimensjoner med størrelse 1, sammenligner former fra høyre, og keepdims=True beholder aksene slik at beregningene passer sammen. Neste tema: boolsk maskering.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Regler for broadcasting» gratis?

Ja – hele teksten i «Regler for broadcasting» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Pandas & NumPy Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Pandas & NumPy Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Regler for broadcasting»?

Forstå NumPys regler for broadcasting, slik at De kan legge en 1D-tabell til hver rad i en 2D-tabell uten eksplisitt replikering. Du øver på Pandas & NumPy Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Pandas & NumPy Academy?

Ingen tidligere erfaring er nødvendig. Pandas & NumPy Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Regler for broadcasting»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Pandas & NumPy Academy-leksjonen?

Ja. Alle Pandas & NumPy Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Universelle funksjoner (ufuncs)
  2. Aggregeringsfunksjoner
  3. Regler for broadcasting
  4. Boolsk maskering og avansert indeksering
← Tilbake til Pandas & NumPy Academy