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

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut