Du räknar ut nya priser från en lista, men uttrycket priser * 1.25 ger inte den nya listan du tänkt dig. För numeriska beräkningar kan en array vara rätt val, men Python har flera olika slags samlingar som kallas så i olika sammanhang.

Välj samling efter hur du ska använda värdena
- List passar när samlingen ska kunna ändras och innehålla olika slags värden.
- array.array lagrar värden av en angiven grundtyp i en kompakt sekvens.
- NumPy ndarray passar för numeriska beräkningar, flera dimensioner och operationer på hela samlingen.
- För prisexemplet kan NumPy multiplicera varje element direkt, medan en lista kräver en loop eller en list comprehension.
Ordet array kan syfta på tre olika saker
En samling med produktpriser kan vara en list, en array.array eller en NumPy-array. Namnen låter närbesläktade, men typerna har olika egenskaper och är inte utbytbara i alla uttryck.
I vanliga Python-program är list ofta det naturliga förstavalet. Listor kan ändras och innehålla värden av olika typer, även om elementen ofta har något gemensamt. Modulen array i Pythons standardbibliotek är i stället avsedd för sekvenser där elementen begränsas till en angiven typ, medan NumPy erbjuder flerdimensionella arrayer för numeriskt arbete. Pythons dokumentation om array beskriver standardbibliotekets variant.
Namnet räcker alltså inte för att avgöra hur en samling fungerar. Titta på typen och på vilka operationer koden behöver utföra.
En lista och en array reagerar olika på multiplikation
Här syns skillnaden direkt. Multiplicera en lista med ett heltal, så upprepas innehållet; multiplikationen gör ingen uträkning med varje värde.
priser = [100, 200, 300]
print(priser * 2)
# [100, 200, 300, 100, 200, 300]
För att höja priserna med 25 procent kan du använda en list comprehension, alltså ett kort uttryck som skapar en ny lista genom att behandla varje element:
nya_priser = [pris * 1.25 for pris in priser]
# [125.0, 250.0, 375.0]
Med NumPy går operationen att skriva direkt på hela arrayen:
import numpy as np
priser = np.array([100, 200, 300])
nya_priser = priser * 1.25
# array([125., 250., 375.])
NumPy utför sådana elementvisa beräkningar utan att du själv skriver en Python-loop. NumPys dokumentation om att skapa arrayer visar också hur listor och nästlade listor kan omvandlas till arrayer. Jag tycker att NumPy är det tydligaste valet när själva poängen är att räkna på många numeriska värden samtidigt.
Välj list för blandade data och NumPy för beräkningar
En lista fungerar bra för en växande samling, exempelvis artiklar i en kundvagn eller texter som ska visas på en webbsida. En standardbiblioteksarray passar bättre när värdena är numeriska och du vill begränsa dem till en grundtyp utan att ta in ett externt paket.
NumPy blir användbart när du ska räkna elementvis, arbeta med matriser eller läsa data till ett numeriskt arbetsflöde. En array med formen (2, 3) har två rader och tre kolumner; med NumPy kan du exempelvis addera en rad värden till varje rad i matrisen när dimensionerna passar ihop. Funktionen kallas broadcasting, och reglerna för kompatibla former avgör om operationen fungerar eller ger ett fel. NumPys guide till broadcasting visar bland annat hur inkompatibla dimensioner stoppar en beräkning.
En praktisk tumregel är enkel: välj list för allmänna samlingar, array.array för typbegränsade sekvenser av grundvärden och NumPy när du behöver numeriska operationer på hela datauppsättningar. För små samlingar som mest lagras och hämtas tillför NumPy ofta mer än du behöver.
Kontrollera typ och form när resultatet blir fel
Om en beräkning oväntat upprepar värden eller ger ett fel handlar problemet ofta om att objektet inte är den typ du tror, eller att NumPy-arrayernas former inte passar ihop. Börja med att skriva ut typen och, för NumPy, formen.
| Situation | Trolig orsak | Gör så här |
|---|---|---|
lista * 2 upprepar elementen |
Objektet är en Python-lista, där heltalsmultiplikation upprepar sekvensen. | Använd en list comprehension eller omvandla till NumPy före beräkningen. |
np.array(...) ger ett fel vid en operation med två arrayer |
Arrayernas dimensioner passar inte ihop enligt broadcasting-reglerna. | Kontrollera a.shape och b.shape; justera formen eller operationen. |
| Ett värde ryms inte i den valda numeriska typen | En begränsad datatyp, exempelvis int8, kan inte representera värdet. |
Välj en typ med större intervall och kontrollera resultatets dtype. |
Den sista situationen är lätt att missa: en NumPy-array kan vara rätt verktyg och ändå ge problem om datatypen är för snäv. I dokumentationens exempel kan int8 lagra heltal från −128 till 127, så värdet 128 ryms inte. Det är alltså skillnad på arrayens form och dess dtype, som anger vilken typ varje element har.
Börja med den enklaste samlingen som passar
Det kan kännas lockande att kalla alla samlingar av värden för arrayer, men i kod spelar den exakta typen roll. För en vanlig lista med innehåll som ska sparas, sorteras eller visas räcker en Python-lista långt.
När du behöver räkna på många tal eller arbeta med data i flera dimensioner är NumPy oftast ett bättre val. Och om du möter array utan sammanhang, kontrollera först om det betyder Pythons standardbiblioteksmodul eller NumPys ndarray; den skillnaden avgör vilka operationer som fungerar.