numpy
je zanimiv modul, ker ima precej funkcij, ki
utegnejo izgledati nenavadne, v resnici pa so resno uporabne. Tipičen
primer je np.nonzero
, ki vrne indekse neničelnih
elementov.
import numpy as np
= np.array([5, 0, 1, 2, 0])
a np.nonzero(a)
(array([0, 2, 3]),)
Zakaj je vrnil terko z enim elementom? Ker pač vedno vrne terko,
elementov v njej pa je toliko, kolikor je dimenzij. Če funkciji
nonzero
podamo dvodimenzionalno tabelo, vrne terko z dvema
tabelama. Prva vsebuje indekse po prvi osi, druga po drugi.
= np.array([[5, 8, 0],
a 0, 1, 2],
[1, 0, 3]])
[
np.nonzero(a)
(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))
To je videti hecno, ampak to so točno indeksi, ki jih potrebujemo, da preberemo te elemente.
= np.nonzero(a) x, y
a[x, y]
array([5, 8, 1, 2, 1, 3])
Ker je par indeksov v resnici terka, gre celo tako.
a[np.nonzero(a)]
array([5, 8, 1, 2, 1, 3])
Še vedno je videti precej brez zveze. Zakaj bi nas tako zelo zanimali
neničelni elementi? Navadno nas res ne, znajo pa nas zanimati neničelni
elementi matrike bool
-ov. To so elementi, ki ustrezajo
določenemu pogoju. Tole, recimo, so indeksi vseh elementov večjih od
1.
> 1) np.nonzero(a
(array([0, 0, 1, 2]), array([0, 1, 2, 2]))
Za konec se spodobi reševati zadnjo nalogo, 25, Sea Cucumber.
Najprej nekaj, o čemer doslej nismo posebej govorili: tabele lahko
vsebujejo tudi nize. Jaz sem si pri reševanju te naloge pripravil
tabelico, katere elementi so bili v resnici črke .
,
>
in <
.
Zdaj pa nasveti. V vsakem koraku ugotovite koordinate vseh
>
. Pripravite koordinate desno od njih. Nato pripravite
masko, ki pove, za katere od njih so koordinate desno od njih (z modulom
po deljenju s širino, da skočimo z desnega roba na levega) proste. S
temi koordinatami in masko potem spraznite trenutna polja in nastanite
nove. Isto ponovite za v
; če se znajdete, bo to kar v zanki
čez ">v"
. Vse skupaj ponavljamo, dokler se uspe komu
premikati.
Ni težko in po nalogi boste imeli dober občutek, da ste se nekaj naučili. Upam. :)