Järjestatud, ühe või mitme indeksiga adresseeritavate elementide kogumit
nimetatakse üldiselt massiiviks (array).
Ühemõõtmelist arvumassiivi nimetatakse ka vektoriks.
Üldotstarbeline Pythoni andmestruktuur mistahes elementide
agregeerimiseks on järjend (andmetüüp list
),
mille saab mugavalt tekitada nurksulgude abil:
a = [1, 2, 3]
b = [10, 20, 30]
Järjend on realiseeritud põhimõttel, et sellele saaks elemente ühekaupa juurde
lisada (meetodiga append
). Kui nurksulgude asemel kasutada ümarsulge,
tekib ennik (tuple
), mille sisu on kirjutuskaitstud
(elemente lisada, eemaldada või üle kirjutada ei saa). Nimetatud andmestruktuure nimetatakse
kokkuvõtvalt jadadeks (sequence).
Jadad ei sobi üldiselt matemaatilisteks operatsioonideks, näiteks
a + b
ei anna tulemuseks mitte [11, 22, 33]
, vaid hoopis
[1, 2, 3, 10, 20, 30]
, st ühendab algsed järjendid. Kui siiski
tingimata tahta jadadega opereerida, oleks optimaalne umbes järgmine
konstruktsioon (list comprehension):
c = [u + v for u, v in zip(a, b)]
Matemaatilisteks vajadusteks on ette nähtud NumPy andmestruktuur nimega
ndarray
. Selle saab defineerida näiteks käsuga numpy.array
,
millele tuleb anda elemendid Pythoni jadana:
a = np.array((1, 2, 3))
b = np.array((10, 20, 30))
Aritmeetilised operatsioonid selliste massiivide vahel
rakenduvad automaatselt element-kaupa, nii et a + b
tekitab nüüd
tõepoolest uue massiivi, mille sisuks on (11, 22, 33)
. Algsed massiivid
peavad muidugi olema ühilduvate mõõtmetega.
Lisaks on NumPy ja SciPy teekides põhjalik komplekt matemaatilisi funktsioone, mis samuti automaatselt rakenduvad kõigile massiivi elementidele. Sellisel viisil saab teostada keerulisi vektoriseeritud arvutusi ilma tsükleid kasutamata. Seejuures võib meelevaldselt segada omavahel skaalareid ja massiive. Massiivide (või NumPy teegi) koosseisus on mitmeid kasulikke meetodeid, sh statistilised funktsioonid, massiivi miinimumi või maksimumi leidmise funktsioonid, jpm. Näide:
# tavaline reaalarv ehk skaalar
p0 = 99.3
# mõõtmisandmed kolmest katsest
p1 = np.array((110.2, 111.42, 108.82))
p2 = np.array((101.64, 101.74, 101.32))
# vektoriseeritud arvutamine üle kõigi katsete
gamma = np.log(p1/p0) / np.log(p1/p2) # tulemus (1.288, 1.267, 1.282)
print('Keskmine: %.3f' % gamma.mean())
Elementide ühekaupa juurdelisamine NumPy massiivile on ebaefektiivne ja
seda tuleks vältida. Sellisel juhul tasub kasutada järjendit või reserveerida
kohe alguses õige suurusega massiiv käsuga numpy.empty
(või
numpy.zeros
või numpy.full
, sõltuvalt olukorrast).