Pandas & NumPy Academy · Oppitunti

Broadcasting-säännöt

Ymmärtäkää NumPyn broadcasting-säännöt, jotta voitte lisätä 1D-taulukon 2D-taulukon jokaiselle riville ilman eksplisiittistä kopiointia.

Oppitunti 3/413 vaihetta

Broadcasting-säännöt on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Ongelma, jonka broadcasting ratkaisee

Broadcasting antaa NumPylle mahdollisuuden yhdistää eri mutta yhteensopivan muotoisia taulukoita kopioimatta dataa — pienempi taulukko venytetään sopimaan suurempaan.

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

Broadcasting-sääntö 1: lisää ykköset alkuun

NumPy kohdistaa muodot oikealta alkaen. Jos toisella taulukolla on vähemmän ulottuvuuksia, sen vasemmalle puolelle lisätään ykkösiä — näin (3,)-taulukko toimii (1, 3)-taulukkona (4, 3)-taulukon rinnalla.

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

Broadcasting-sääntö 2: venytä kooltaan 1 olevia ulottuvuuksia

Kaikki kooltaan 1 olevat ulottuvuudet voidaan venyttää vastaamaan toista taulukkoa — dataa ei todellisuudessa kopioida. Molemmat taulukot voivat venyttää kooltaan 1 olevia ulottuvuuksiaan samanaikaisesti.

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)

Broadcasting-sääntö 3: yhteensopimattomat muodot

Jos kaksi ulottuvuutta eivät ole yhtä suuria eikä kumpikaan ole 1, broadcasting epäonnistuu ja tuloksena on ValueError. Muotojen tarkistaminen ensin tuottaa selkeän virheen piilevän virheen sijaan.

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

Käytännössä: sarakkeen keskiarvon vähentäminen

Klassinen käyttötapaus: vähentäkää kunkin sarakkeen keskiarvo jokaiselta riviltä, jotta data keskitetään. Kun käytätte keepdims=True, keskiarvon muoto säilyy broadcasting-toimintoon sopivana.

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

Käytännössä: rivien normalisointi

Jos haluatte saada jokaisen rivin summaksi 1, jakakaa rivi sen omalla summalla. Käyttäkää keepdims=True, jotta summan muoto säilyy muodossa (n, 1) ja se voidaan levittää sarakkeiden yli.

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

Ulkoiset tulot broadcasting-toiminnolla

Muotoilkaa toinen taulukko muotoon (n, 1) ja toinen muotoon (1, m), minkä jälkeen kertokaa ne — broadcasting muodostaa puolestanne kokonaisen ulkoisen tulon matriisin ilman silmukoita.

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 3D-taulukoilla

Broadcasting toimii millä tahansa ulottuvuuksien määrällä. Muodossa (100, 28, 28) oleva kuvajoukko voidaan keskittää pikselikohtaisella keskiarvolla, jonka muoto on (1, 28, 28) — NumPy venyttää ykkösen.

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 eksplisiittiseen venyttämiseen

np.broadcast_to näyttää täsmälleen, millaisen tuloksen broadcasting tuottaa, vain luku -näkymänä ilman kopiointia. Se sopii erinomaisesti muotojen kohdistumisen havainnollistamiseen.

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

Yhteensopivien muotojen havainnollistaminen

Kätevä sääntö: kohdistakaa muodot oikealta alkaen ja tarkistakaa jokainen pari. Ne ovat yhteensopivia, jos ne ovat yhtä suuret tai toinen niistä on 1. Ennustakaa muodot ennen koodin suorittamista!

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

Yleiset broadcasting-virheet

Yleisin broadcasting-ansa on keepdims=True-argumentin unohtaminen aggregoinnin jälkeen, jolloin muodot eivät kohdistu. Kun jäätte jumiin, tulostakaa print(arr.shape), jotta näette, mitä todella tapahtuu.

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

Pikatarkistus

Testatkaa ymmärrystänne tämän oppitunnin NumPy-broadcasting-säännöistä.

Oppitunnin yhteenveto

Hienosti tehty! Broadcasting venyttää kooltaan 1 olevia ulottuvuuksia, vertailee muotoja oikealta alkaen, ja keepdims=True säilyttää akselit, jotta laskutoimitukset kohdistuvat oikein. Seuraavaksi: totuusarvomaskit.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Broadcasting-säännöt” ilmainen?

Kyllä – oppitunnin ”Broadcasting-säännöt” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Broadcasting-säännöt”?

Ymmärtäkää NumPyn broadcasting-säännöt, jotta voitte lisätä 1D-taulukon 2D-taulukon jokaiselle riville ilman eksplisiittistä kopiointia. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Broadcasting-säännöt”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Yleiset funktiot (ufuncs)
  2. Aggregointifunktiot
  3. Broadcasting-säännöt
  4. Totuusarvomaskaus ja fancy-indeksointi
← Takaisin: Pandas & NumPy Academy