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.
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) # FalseYhteensopivien 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) OKPikatarkistus
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.
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
- Yleiset funktiot (ufuncs)
- Aggregointifunktiot
- Broadcasting-säännöt
- Totuusarvomaskaus ja fancy-indeksointi