42 Funktsioonide kasutamine NumPy kahemõõtmeliste järjenditega
Aritmeetiline keskmine
Kahemõõtmeliste järjendite puhul on sageli vaja leida iga rea või veeru aritmeetiline keskmine. Selleks saab kasutada mean
funktsiooni, kuid täpsustama peab, kas aritmeetilisi keskmisi soovitakse leida ridadele või veergudele. Lisada tuleb juurde parameeter axis
ja väärtustada see kas 1-ga (read) või 0-ga (veerud). Tulemuseks on ühemõõtmeline järjend vastavate keskmistega.
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [1, 6, 3, 7], [1, 6, 7, 2], [5, 7, 3, 2]]) keskmine_read = np.mean(b, axis=1) keskmine_veerud = np.mean(b, axis=0) print("Ridade aritmeetilised keskmised:", keskmine_read) print("Veergude aritmeetilised keskmised", keskmine_veerud)
>>> %Run guido.py Ridade aritmeetilised keskmised: [2.5 6.5 4.25 4. 4.25] Veergude aritmeetilised keskmised [2.6 5.4 4.6 4.6]
Oma funktsiooni kasutamine
Ka kahemõõtmeliste järjendite peal on võimalik kasutada kasutaja loodud funktsioone. Näiteks soovime kõikidel järjendi elementidel rakendada järgmist valemit.
element**2 + element * 5 - 1
Selleks defineerime vastava funktsiooni
def arvuta(lst): return lst**2 + lst * 5 - 1
Järgnevalt rakendame funktsiooni järjendi peal.
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [1, 6, 3, 7], [1, 6, 7, 2], [5, 7, 3, 2]]) c = arvuta(b) print(c)
>>> %Run guido.py [[ 5 13 23 35] [ 49 65 83 103] [ 5 65 23 83] [ 5 65 83 13] [ 49 83 23 13]]
Nüüd aga rakendame funktsiooni tabeli igal real või veerul. Selleks kasutame apply_along_axis
funktsiooni, mis võimaldab kasutaja defineeritud funktsioone rakendada tabeli igal real või veerul. apply_along_axis
argumentideks tuleb anda oma funktsiooni nimi
, suund
(1
– read, 0
– veerud) ja järjendi nimi
. Tulemuseks on ühemõõtmeline järjend vastavate rea või veeru väärtustega.
! Defineeritud funktsiooni argumendiks peab olema ühemõõtmeline järjend.
def summa(lst): return np.sum(lst) * 11 - 5 b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [1, 6, 3, 7]]) arvuta_read = np.apply_along_axis(summa, 1, b) arvuta_veerud = np.apply_along_axis(summa, 0, b) print("Read:", arvuta_read) print("Veerud", arvuta_veerud)
>>> %Run guido.py Read: [105 281 182] Veerud [ 72 149 138 204]
Lisame arvutatud veeru tabelisse. Kuna soovime lisada kahemõõtmelisele järjendile juurde ühemõõtmelise järjendi, siis appendi
siin kasutada ei saa. Selleks on olemas NumPy funktsioon column_stack
, mille argument on ennik. Enniku esimene element on kahemõõtmeline järjend, kuhu soovitakse veerg lisada, ja teine element on ühemõõtmeline järjend, mida lisatakse.
def summa(lst): return np.sum(lst) * 11 - 5 b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [1, 6, 3, 7]]) arvuta_read = np.apply_along_axis(summa, 1, b) c = np.column_stack((b, arvuta_read)) print("Uue veeruga järjend: ", c)
>>> %Run guido.py Uue veeruga järjend: [[ 1 2 3 4 105] [ 5 6 7 8 281] [ 1 6 3 7 182]]
Sarnaselt saab kasutada ka row_stack
funktsiooni rea lisamiseks.