6.8. Operatori

Prva vrsta matematike koju numpy izvodi na ndarray standardni su Python operatori. Aritmetički, usporedbeni i bitovni operatori svi rade element po element – svaki operator prolazi poljem (ili objema poljima) jednom od početka do kraja unutar jednog poziva biblioteke, mnogo brže od ekvivalentne Python for petlje.

6.8.1. Aritmetika

+, -, *, /, //, %, ** svi rade između dvaju polja kompatibilnog oblika ili između polja i skalara:

a = np.array([1, 2, 3, 4], dtype=np.float)
b = np.array([10, 20, 30, 40], dtype=np.float)

print(a + b)        # array([11.0, 22.0, 33.0, 44.0])
print(a * 2)        # array([2.0, 4.0, 6.0, 8.0])
print(b - a)        # array([9.0, 18.0, 27.0, 36.0])
print(b / a)        # array([10.0, 10.0, 10.0, 10.0])

Dtype rezultata slijedi pravila proširivanja tipa opisana na Dtypes. Cjelobrojna polja prelaze (wrap) pri prelijevanju; pretvorite ih u širi dtype prije operacije kada je to bitno.

Operator matričnog množenja @ nije implementiran. Za matrične / vektorske umnoške upotrijebite dot().

6.8.1.1. Oblici na licu mjesta (in-place)

Svaki aritmetički operator ima oblik na licu mjesta – +=, -=, *=, /=, %=, **=. Oblik na licu mjesta zapisuje kroz postojeći međuspremnik umjesto da alocira privremeni:

b = b + 1            # allocates a temporary the size of b
b += 1               # no temporary

Na mikrokontroleru je drugi oblik u biti obvezan za svaku vruću petlju.

6.8.2. Bitovno

Bitovni operatori &, |, ^ rade element po element na cjelobrojnim poljima. Primijenjeni na float ili complex polje podižu TypeError

a = np.array([0b1100, 0b1010], dtype=np.uint8)
b = np.array([0b1010, 0b1100], dtype=np.uint8)
print(a & b)        # array([8, 8], dtype=uint8)
print(a | b)        # array([14, 14], dtype=uint8)
print(a ^ b)        # array([6, 6], dtype=uint8)

Unarni ~ izvodi bitovno NOT na cjelobrojnom polju.

Operatori pomaka << i >> nisu povezani na razini Python operatora. Funkcijski oblici left_shift() i right_shift() rade:

np.left_shift(a, 2)
np.right_shift(b, 1)

6.8.3. Usporedba

==, !=, <, <=, >, >= svi vraćaju bool ndarray emitiranog oblika:

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)

Logički rezultat upravo je ono što troše indeksiranje i Odabir i preraspoređivanje.

6.8.3.1. Pravilo o strani

ndarray mora biti s lijeve strane relacijskog operatora pri usporedbi sa skalarom. a > 2 radi; 2 < a podiže TypeError. Za simetrični oblik upotrijebite imena funkcija:

np.greater(5, a)        # 5 > a, element-wise
np.less(5, a)           # 5 < a, element-wise
np.equal(5, a)          # 5 == a, element-wise
np.not_equal(5, a)      # 5 != a, element-wise

6.8.4. Unarni operatori

  • +a – vraća kopiju polja.

  • -a – negacija. Na nepredznačenim dtype-ovima vrijednosti prelaze (wrap) po modulu \(2^N\), na isti način kao i binarni operatori.

  • abs(a) – apsolutna vrijednost element po element. Na nepredznačenim dtype-ovima vraća kopiju bez izračuna.

  • ~a – bitovna inverzija (samo cjelobrojna polja).

  • len(a) – vraća duljinu prve osi, sukladno Python konvenciji za sekvence.

6.8.5. Što nedostaje

Desnostrani operatori za usporedbu i neke od bitovnih operacija nisu implementirani na isti način kao aritmetički operatori. Upotrijebite funkcijske oblike (gore) kada bi ndarray završio s desne strane.

Za potpun popis podržanih operatora i proširivanja tipa koje slijede pogledajte numpy — numpy-kompatibilne operacije nad poljima.