6.2. ndarray

ndarray je tip koji drži numeričke podatke u numpy. Dvije su stvari u jednome: jedan zbijeni blok podataka i mali deskriptor ispred tog bloka koji govori kako ga čitati.

6.2.1. Unutar kutije

Blok podataka drži svaki element polja od početka do kraja, bez ičega dodatnog između njih. Svaki element zauzima isti broj bajtova – jedan za polje uint8 vrijednosti, dva za uint16, četiri za float. Polje od 256 elemenata tipa uint8 je točno 256 bajtova podataka; istih 256 brojeva u Python list zauzima kilobajt – jedan 32-bitni utor po elementu bez obzira na to koliko malo bitova vrijednost zapravo treba.

Deskriptor bilježi što blok znači. Pet vrijednosti dovoljno je za opis svakog pravokutnog polja, bez obzira na broj dimenzija:

  • dtype – tip elementa. Određuje koliko bajtova svaki element zauzima i koji raspon vrijednosti može držati (obrađeno u Dtypes).

  • itemsize – širina jednog elementa u bajtovima, izvedena iz dtypea.

  • ndim – broj dimenzija (1 za vektor, 2 za matricu, 3 za volumen, do 4).

  • shape – veličina duž svake dimenzije kao torka.

  • strides – kako koračati kroz blok podataka pri obilasku svake osi. Obrađeno u Oblik i koraci.

To je to. Svaki brzi put u numpy – aritmetika, redukcije, emitiranje, isjecanje – radi izravno iz tih pet vrijednosti plus pokazivača na podatke, bez Python troška po elementu.

6.2.2. Što dizajn donosi

Tri svojstva proizlaze iz „zbijeni blok + mali deskriptor” i određuju kako se ostatak odjeljka ponaša.

Matematika po elementima izvodi se kao jedan poziv. a + b između dva polja podudarnog oblika zbraja dva međuspremnika i zapisuje treći, sve unutar jednog poziva biblioteke. np.sin(a) radi isto za sinus svakog elementa. Aritmetički operatori, operatori usporedbe i bitovni operatori svi rade na ovaj način.

Gledanje istih podataka na drugi način je besplatno. Traženje podregije polja, ili istih podataka raspoređenih pod drugim oblikom, ne pomiče nijedan bajt. Operacija vraća novi deskriptor koji pokazuje na isti blok podataka. Rezultat se naziva pogled – drugi prozor na isti temeljni međuspremnik. Pisanje kroz pogled piše u izvor.

Pomiješani oblici i dalje rade. Kraće polje protiv duljeg, redak protiv matrice, stupac protiv retka – numpy ih poravnava emitiranjem, malim skupom pravila koja odlučuju koja se kratka os rasteže da odgovara dugoj. Rastezanje je virtualno; nijedan podatak se ne duplicira.

6.2.3. Što dizajn košta

Dva ograničenja proizlaze iz istog dizajna.

Svaki element ima isti tip. Lista može držati int pokraj str pokraj liste od tri dodatne int vrijednosti; ndarray ne može. Dtype je fiksiran u trenutku stvaranja. Stranica Dtypes obrađuje mali skup tipova koje numpy podržava i pravila koja proizlaze iz fiksiranja tipa.

Rast polja nije besplatan. Lista zadržava rezervne utore na kraju i jeftino podržava .append. ndarray je točno one veličine koju treba biti; dodavanje bi značilo alociranje novog, većeg međuspremnika i kopiranje starog sadržaja u njega. Metode append() namjerno nema. Pravi obrazac na kameri je unaprijed alocirati odredište na konačnoj veličini i popuniti ga; Performanse obrađuje tehniku.

Sa zbijenim tipiziranim međuspremnikom za podatke, malim deskriptorom za metapodatke i tri jamstva ponašanja (brza matematika po elementima, alternativni pogledi na iste podatke bez kopiranja i oblici koji se emitiraju), ndarray je temelj na kojem počiva ostatak poglavlja. Kako polje zapravo nastaje – iz literala, iz unaprijed popunjene alokacije, iz međuspremnika periferije – sljedeće je praktično pitanje.