6.2. ndarray

ndarray on tyyppi, joka pitää numeerista dataa numpy-moduulissa. Se on kaksi asiaa yhdessä: yksi tiivis datalohko ja sen lohkon edessä oleva pieni kuvaaja, joka kertoo, kuinka se luetaan.

6.2.1. Laatikon sisällä

Datalohko sisältää taulukon jokaisen alkion peräkkäin ilman mitään ylimääräistä niiden välissä. Kukin alkio vie saman määrän tavuja – yhden uint8-arvojen taulukolle, kaksi uint16-tyypille, neljä float-tyypille. 256-alkioinen uint8-taulukko on tarkalleen 256 tavua dataa; samat 256 numeroa Python-list-listassa vievät kilotavun – yksi 32-bittinen lokero alkiota kohti riippumatta siitä, kuinka vähän bittejä arvo todellisuudessa tarvitsee.

Kuvaaja tallentaa, mitä lohko tarkoittaa. Viisi arvoa riittää kuvaamaan minkä tahansa suorakulmaisen taulukon, riippumatta ulottuvuuksien määrästä:

  • dtype – alkioiden tyyppi. Päättää, kuinka monta tavua kukin alkio vie ja mitä arvoaluetta se voi pitää (käsitellään sivulla Dtype-tyypit).

  • itemsize – yhden alkion tavuleveys, johdettu dtypestä.

  • ndim – ulottuvuuksien määrä (1 vektorille, 2 matriisille, 3 tilavuudelle, enintään 4).

  • shape – koko kunkin ulottuvuuden suunnassa monikkona.

  • strides – kuinka datalohkon läpi astutaan kunkin akselin kävelemiseksi. Käsitellään sivulla Muoto ja askelvälit.

Siinä se. Jokainen numpy-moduulin nopea polku – aritmetiikka, redukoinnit, lähetys, siivutus – toimii suoraan näistä viidestä arvosta plus dataosoittimesta, ilman alkiokohtaista Python-ylikuormaa.

6.2.2. Mitä suunnittelu tuo mukanaan

Kolme ominaisuutta seuraa periaatteesta ”tiivis lohko + pieni kuvaaja” ja määrittää, kuinka osion loppuosa käyttäytyy.

Alkiokohtainen matematiikka suoritetaan yhdellä kutsulla. a + b kahden samanmuotoisen taulukon välillä summaa kaksi puskuria ja kirjoittaa kolmannen, kaikki yhden kirjastokutsun sisällä. np.sin(a) tekee saman jokaisen alkion sinille. Aritmeettiset, vertailu- ja bittioperaattorit toimivat kaikki tällä tavalla.

Saman datan katsominen eri tavalla on ilmaista. Taulukon osa-alueen pyytäminen tai saman datan asetteleminen eri muodon alle ei siirrä yhtään tavua. Operaatio palauttaa uuden kuvaajan, joka osoittaa samaan datalohkoon. Tulosta kutsutaan näkymäksi – toiseksi ikkunaksi samaan taustalla olevaan puskuriin. Näkymän kautta kirjoittaminen kirjoittaa lähteeseen.

Sekamuodot toimivat silti. Lyhyempi taulukko pidempää vastaan, rivi matriisia vastaan, sarake riviä vastaan – numpy rivittää ne lähettämällä (broadcasting), pienellä joukolla sääntöjä, jotka päättävät, mikä lyhyt akseli venyy vastaamaan pitkää. Venytys on virtuaalinen; mitään dataa ei monisteta.

6.2.3. Mitä suunnittelu maksaa

Kaksi rajoitusta seuraa samasta suunnittelusta.

Jokaisella alkiolla on sama tyyppi. Lista voi pitää int-arvon str-arvon vieressä kolmen muun int-arvon listan vieressä; ndarray ei voi. Dtype on kiinteä rakennushetkellä. Dtype-tyypit-sivu käsittelee sen pienen joukon tyyppejä, joita numpy tukee, ja säännöt, jotka yhden kiinnittämisestä seuraavat.

Taulukon kasvattaminen ei ole ilmaista. Lista pitää varalokeroita lopussa ja tukee .append-operaatiota halvalla. ndarray on tarkalleen sen kokoinen kuin sen tarvitsee olla; lisääminen tarkoittaisi uuden, suuremman puskurin varaamista ja vanhan sisällön kopioimista siihen. append()-metodia ei ole, tarkoituksella. Oikea malli kamerassa on varata kohde etukäteen sen lopulliseen kokoon ja täyttää se; Suorituskyky käsittelee tekniikan.

Datalle tarkoitetulla tiiviillä tyypitetyllä puskurilla, metadatalle tarkoitetulla pienellä kuvaajalla ja kolmella käyttäytymistakuulla (nopea alkiokohtainen matematiikka, saman datan kopioimattomat vaihtoehtoiset näkymät ja muodot, jotka lähetetään) ndarray on perusta, jonka päälle luvun loppuosa nojaa. Kuinka taulukko todellisuudessa syntyy – literaalista, esitäytetystä varauksesta, oheislaitepuskurista – on seuraava käytännön kysymys.