Niet te missen ons GRATIS NumPy spiekbriefje onderaan deze post
NumPy is een veelgebruikt Python data analyse pakket. Door NumPy te gebruiken, kun je je workflow versnellen, en kun je interfacen met andere pakketten in het Python ecosysteem, zoals scikit-learn, die NumPy onder de motorkap gebruiken. NumPy is oorspronkelijk ontwikkeld in het midden van de jaren 2000, en is voortgekomen uit een nog ouder pakket genaamd Numeric. Deze lange levensduur betekent dat bijna elke data-analyse of machine learning pakket voor Python maakt gebruik van NumPy op een of andere manier.
In deze tutorial lopen we door het gebruik van NumPy om gegevens over wijnkwaliteit te analyseren. De gegevens bevatten informatie over verschillende attributen van wijnen, zoals pH
en fixed acidity
, samen met een kwaliteitsscore tussen 0
en 10
voor elke wijn. De kwaliteitsscore is het gemiddelde van ten minste 3
menselijke smaaktesters. Terwijl we leren werken met NumPy, zullen we proberen meer te weten te komen over de waargenomen kwaliteit van wijn.
De wijnen die we zullen analyseren, komen uit de Minho-regio van Portugal.
De gegevens zijn gedownload van de UCI Machine Learning Repository, en zijn hier beschikbaar. Hier zijn de eerste paar rijen van het winequality-red.csv
bestand, dat we zullen gebruiken in deze tutorial:
"fixed acidity";"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;57.8;0.88;0;2.6;0.098;25;67;0.9968;3.2;0.68;9.8;5
De gegevens zijn in wat ik ga noemen ssv (puntkomma gescheiden waarden) formaat – elk record wordt gescheiden door een puntkomma (;
), en rijen worden gescheiden door een nieuwe regel. Er zijn 1600
rijen in het bestand, inclusief een header rij, en 12
kolommen.
Voordat we aan de slag gaan, een snelle versie noot – we zullen Python 3.5 gebruiken. Onze codevoorbeelden zullen worden gedaan met behulp van Jupyter notebook.
- Lijsten van lijsten voor CSV-gegevens
- Numpy 2-Dimensionale Arrays
- Een NumPy-array maken
- Alternatieve NumPy Array Creation Methods
- Gebruik NumPy om bestanden in te lezen
- Indexeren van NumPy-arrays
- Slicing NumPy Arrays
- Waarden toewijzen aan NumPy-arrays
- 1-Dimensionale NumPy-arrays
- N-Dimensionale NumPy-arrays
- NumPy Data Types
- Converting Data Types
- NumPy Array Operations
- Single Array Math
- Multiple Array Math
- Broadcasting
- NumPy Array Methods
- NumPy Array Comparisons
- Subsetting
- Reshaping NumPy Arrays
- Combining NumPy Arrays
- Gratis NumPy Cheat Sheet
- Verder lezen
Lijsten van lijsten voor CSV-gegevens
Voordat we NumPy gebruiken, zullen we eerst proberen om met de gegevens te werken met behulp van Python en het csv-pakket. We kunnen het bestand inlezen met behulp van het object csv.reader, waarmee we alle inhoud van het ssv-bestand kunnen inlezen en splitsen.
In de onderstaande code:
- Importeer de
csv
bibliotheek. - Open het
winequality-red.csv
bestand.- Met het bestand open, maakt u een nieuw
csv.reader
object.- Geef het sleutelwoordargument
delimiter=";"
in om ervoor te zorgen dat de records worden gesplitst op het teken puntkomma in plaats van het standaard teken komma.
- Geef het sleutelwoordargument
- Roep het lijsttype op om alle rijen uit het bestand te halen.
- Benoem het resultaat aan
wines
.
- Met het bestand open, maakt u een nieuw
import csvwith open('winequality-red.csv', 'r') as f: wines = list(csv.reader(f, delimiter=';'))
Als we de gegevens hebben ingelezen, kunnen we de eerste 3
rijen uitprinten:
print(wines)
, , ]
De gegevens zijn ingelezen in een lijst van lijsten. Elke binnenste lijst is een rij uit het ssv-bestand. Zoals je misschien hebt gemerkt, wordt elk item in de hele lijst van lijsten voorgesteld als een string, wat het moeilijker maakt om berekeningen uit te voeren.
We zullen de gegevens in een tabel formatteren, zodat ze makkelijker te bekijken zijn:
vaste zuurgraad | vluchtige zuurgraad | citroenzuur | restsuiker | chloriden | vrije zwavel zwaveldioxide | totaal zwaveldioxide | dichtheid | pH | sulfaten | alcohol | kwaliteit |
---|---|---|---|---|---|---|---|---|---|---|---|
7.4 | 0.70 | 0 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
Zoals u in de tabel hierboven kunt zien, hebben we drie rijen ingelezen, waarvan de eerste kolomkoppen bevat. Elke rij na de header-rij vertegenwoordigt een wijn. Het eerste element van elke rij is de fixed acidity
, het tweede is de volatile acidity
, enzovoort. We kunnen het gemiddelde quality
van de wijnen vinden. De onderstaande code zal:
- Extraheer het laatste element van elke rij na de header rij.
- Converteer elk geëxtraheerd element naar een float.
- Benoem alle geëxtraheerde elementen aan de lijst
qualities
. - Deel de som van alle elementen in
qualities
door het totaal aantal elementen inqualities
om het gemiddelde te krijgen.
qualities =) for item in wines]sum(qualities) / len(qualities)
5.6360225140712945
Hoewel we in staat waren om de berekening uit te voeren die we wilden, is de code vrij complex, en het zal niet leuk zijn om iets soortgelijks te moeten doen elke keer dat we een hoeveelheid willen berekenen. Gelukkig kunnen we NumPy gebruiken om het makkelijker te maken om met onze gegevens te werken.
Numpy 2-Dimensionale Arrays
Met NumPy werken we met multidimensionale arrays. We zullen later ingaan op alle mogelijke types van multidimensionale arrays, maar voor nu zullen we ons richten op 2-dimensionale arrays. Een 2-dimensionale array is ook gekend als een matrix, en is iets waarmee je vertrouwd zou moeten zijn. In feite is het gewoon een andere manier van denken over een lijst van lijsten. Een matrix heeft rijen en kolommen. Door een rij nummer en een kolom nummer op te geven, kunnen we een element uit een matrix halen.
In de onderstaande matrix is de eerste rij de header-rij, en de eerste kolom is de fixed acidity
-kolom:
vaste zuurgraad | vluchtige zuurgraad | citroenzuur | restsuiker | chloriden | vrije zwavel zwaveldioxide | totaal zwaveldioxide | dichtheid | pH | sulfaten | alcohol | kwaliteit |
---|---|---|---|---|---|---|---|---|---|---|---|
7.4 | 0.70 | 0 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
Als we het element in de eerste rij en de tweede kolom zouden kiezen, zouden we volatile acidity
krijgen. Als we het element in de derde rij en de tweede kolom zouden kiezen, zouden we 0.88
krijgen.
In een NumPy-array wordt het aantal dimensies de rang genoemd, en elke dimensie wordt een as genoemd. Dus de rijen zijn de eerste as, en de kolommen zijn de tweede as.
Nu u de basis van matrices begrijpt, laten we eens kijken hoe we van onze lijst van lijsten naar een NumPy-array kunnen komen.
Een NumPy-array maken
We kunnen een NumPy-array maken met behulp van de functie numpy.array. Als we een lijst met lijsten invoeren, wordt er automatisch een NumPy array gemaakt met hetzelfde aantal rijen en kolommen. Omdat we willen dat alle elementen in de array float-elementen zijn voor eenvoudige berekeningen, laten we de header-rij weg, die strings bevat. Een van de beperkingen van NumPy is dat alle elementen in een matrix van hetzelfde type moeten zijn, dus als we de header-rij invoegen, zullen alle elementen in de matrix als strings worden ingelezen. Omdat we berekeningen willen kunnen uitvoeren, zoals het gemiddelde quality
van de wijnen vinden, moeten de elementen allemaal vlotters zijn.
In de onderstaande code, we:
- Importeer het
numpy
pakket. - Pass de lijst van lijsten
wines
in dearray
functie, die het omzet in een NumPy array.- Excludeer de header rij met list slicing.
- Specificeer het keyword argument
dtype
om ervoor te zorgen dat elk element wordt geconverteerd naar een float. We zullen later dieper ingaan op wat dedtype
is.
import csvwith open("winequality-red.csv", 'r') as f: wines = list(csv.reader(f, delimiter=";"))import numpy as npwines = np.array(wines, dtype=np.float)
Probeer de bovenstaande code uit te voeren en kijk wat er gebeurt!
Als we wines
weergeven, krijgen we nu een NumPy array:
wines
array(,,,...,,,])
We kunnen het aantal rijen en kolommen in onze gegevens controleren met behulp van de shape eigenschap van NumPy arrays:
wines.shape
(1599, 12)
Alternatieve NumPy Array Creation Methods
Er zijn verschillende methoden die u kunt gebruiken om NumPy arrays te maken. Om te beginnen kunt u een array maken waarvan elk element nul is. De onderstaande code maakt een array met 3
rijen en 4
kolommen, waarbij elk element 0
is, met behulp van numpy.nullen:
import numpy as np
empty_array = np.zeros((3,4)) empty_array
Het is handig om een array met allemaal nul elementen te maken in gevallen waarin je een array van vaste grootte nodig hebt, maar er nog geen waarden voor hebt.
Je kunt ook een array maken waarbij elk element een willekeurig getal is met behulp van numpy.random.rand. Hier is een voorbeeld:
np.random.rand(3,4)
array(,,])
Het maken van arrays vol willekeurige getallen kan handig zijn als je snel je code wilt testen met voorbeeldarrays.
Gebruik NumPy om bestanden in te lezen
Het is mogelijk om NumPy te gebruiken om csv of andere bestanden direct in arrays in te lezen. We kunnen dit doen met de functie numpy.genfromtxt. We kunnen het gebruiken om onze eerste gegevens over rode wijnen in te lezen.
In onderstaande code:
- Gebruik de functie
genfromtxt
om het bestandwinequality-red.csv
in te lezen. - Specificeer het sleutelwoordargument
delimiter=";"
zodat de velden goed worden geparst. - Specifieer het sleutelwoordargument
skip_header=1
zodat de header-rij wordt overgeslagen.
wines = np.genfromtxt("winequality-red.csv", delimiter=";", skip_header=1)
wines
zal er uiteindelijk hetzelfde uitzien als wanneer we het in een lijst zouden lezen en het vervolgens zouden converteren naar een array van floats. NumPy kiest automatisch een gegevenstype voor de elementen in een array op basis van hun formaat.
Indexeren van NumPy-arrays
We weten nu hoe we arrays moeten maken, maar tenzij we er resultaten uit kunnen halen, kunnen we niet veel doen met NumPy. We kunnen array indexering gebruiken om individuele elementen, groepen van elementen, of hele rijen en kolommen te selecteren. Een belangrijk ding om in gedachten te houden is dat NumPy, net als Python-lijsten, een nulindex heeft, wat betekent dat de index van de eerste rij 0
is, en de index van de eerste kolom 0
is. Als we met de vierde rij willen werken, gebruiken we index 3
, als we met de tweede rij willen werken, gebruiken we index 1
, enzovoort. We werken weer met de matrix wines
:
7.4 | 0.70 | 0.00 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0.00 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
7.8 | 0.76 | 0.04 | 2.3 | 0.092 | 15 | 54 | 0.9970 | 3.26 | 0.65 | 9.8 | 5 |
11.2 | 0.28 | 0.56 | 1.9 | 0.075 | 17 | 60 | 0.9980 | 3.16 | 0.58 | 9.8 | 6 |
7.4 | 0.70 | 0.00 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
Laten we het element selecteren op rij 3
en kolom 4
. In de onderstaande code geven we de index 2
op als rij-index, en de index 3
als kolom-index. Dit haalt de waarde op uit de vierde kolom van de derde rij:
wines
2.2999999999999998
Omdat we werken met een 2-dimensionale array in NumPy, specificeren we 2 indexen om een element op te halen. De eerste index is de rij, of as 1
, index, en de tweede index is de kolom, of as 2
, index. Elk element in wines
kan worden opgehaald met de 2
indexen.
Slicing NumPy Arrays
Als we in plaats daarvan de eerste drie items uit de vierde kolom willen selecteren, kunnen we dat doen met een dubbele punt (:
). Een dubbele punt geeft aan dat we alle elementen willen selecteren vanaf de beginindex tot maar niet inclusief de eindindex. Dit wordt ook wel een slice genoemd:
wines
array()
Net als bij list slicing is het mogelijk om de 0
weg te laten om gewoon alle elementen vanaf het begin tot en met element 3
op te halen:
wines
array()
We kunnen een hele kolom selecteren door aan te geven dat we alle elementen willen, van de eerste tot en met de laatste. We specificeren dit door alleen de dubbele punt (:
) te gebruiken, zonder begin- of eindindexen. De onderstaande code selecteert de hele vierde kolom:
wines
array()
We hebben hierboven een hele kolom geselecteerd, maar we kunnen ook een hele rij extraheren:
wines
array()
Als we onze indexering tot het uiterste doorvoeren, kunnen we de hele matrix selecteren door twee dubbele punten te gebruiken om alle rijen en kolommen in wines
te selecteren. Dit is een leuke party-truc, maar heeft niet veel goede toepassingen:
wines
array(,,<br />,<br />...,,,<br />])
Waarden toewijzen aan NumPy-arrays
We kunnen indexering ook gebruiken om waarden toe te wijzen aan bepaalde elementen in arrays. We kunnen dit doen door direct toe te wijzen aan de geïndexeerde waarde:
wines = 10
Hetzelfde kunnen we doen voor slices. Om een hele kolom te overschrijven, kunnen we dit doen:
wines = 50
De bovenstaande code overschrijft alle waarden in de elfde kolom met 50
.
1-Dimensionale NumPy-arrays
Tot nu toe hebben we gewerkt met 2-dimensionale arrays, zoals wines
. NumPy is echter een pakket voor het werken met multidimensionale arrays. Een van de meest voorkomende types van multidimensionele arrays is de 1-dimensionale array, of vector. Zoals je hierboven misschien hebt opgemerkt, hebben we, toen we wines
sneden, een 1-dimensionale array opgehaald. Een 1-dimensionale array heeft slechts een enkele index nodig om een element op te halen. Elke rij en kolom in een 2-dimensionale array is een 1-dimensionale array. Net zoals een lijst van lijsten analoog is aan een 2-dimensionale array, is een enkele lijst analoog aan een 1-dimensionale array. Als we wijn slicen en alleen de derde rij ophalen, krijgen we een 1-dimensionale array:
third_wine = wines
Hier ziet third_wine
eruit:
11.2000.2800.5601.9000.07517.00060.0000.9983.1600.5809.8006.000
We kunnen individuele elementen uit third_wine
ophalen met behulp van een enkele index. De onderstaande code zal het tweede item in third_wine
weergeven:
third_wine
0.28000000000000003
De meeste NumPy-functies waarmee we hebben gewerkt, zoals numpy.random.rand, kunnen worden gebruikt met multidimensionale arrays. Hier is hoe we numpy.random.rand
zouden gebruiken om een willekeurige vector te genereren:
np.random.rand(3)
array()
Vorige keer, toen we np.random.rand
aanriepen, hebben we een vorm voor een 2-dimensionale matrix doorgegeven, dus het resultaat was een 2-dimensionale matrix. Deze keer hebben we een vorm voor een array van één dimensie doorgegeven. De vorm specificeert het aantal dimensies, en de grootte van de array in elke dimensie. Een vorm van (10,10)
is een 2-dimensionale matrix met 10
rijen en 10
kolommen. Een shape van (10,)
is een 1-dimensionale array met 10
elementen.
Waar NumPy complexer wordt, is wanneer we te maken krijgen met arrays die meer dan 2
dimensies hebben.
N-Dimensionale NumPy-arrays
Het komt niet zo vaak voor, maar er zijn gevallen waarin je te maken wilt krijgen met arrays die meer dan 3
dimensies hebben. Een manier om dit te zien is als een lijst van lijsten van lijsten. Laten we zeggen dat we de maandelijkse inkomsten van een winkel willen opslaan, maar we willen ook snel de resultaten van een kwartaal en een jaar kunnen bekijken. De verdiensten voor een jaar zouden er als volgt uit kunnen zien:
De winkel verdiende 0
in januari, 5
in februari, enzovoort. We kunnen deze verdiensten per kwartaal opsplitsen in een lijst:
year_one = , , , ]
We kunnen de verdiensten van januari opvragen door year_one
op te roepen. Als we de resultaten voor een heel kwartaal willen, kunnen we year_one
of year_one
aanroepen. We hebben nu een 2-dimensionale array, of matrix. Maar wat als we nu de resultaten van een ander jaar willen toevoegen? We moeten een derde dimensie toevoegen:
earnings = , , , ], , , , ]]
We kunnen de resultaten van januari van het eerste jaar opvragen door earnings
op te roepen. We hebben nu drie indexen nodig om een enkel element op te vragen. Een driedimensionale array in NumPy is ongeveer hetzelfde. In feite kunnen we earnings
omzetten naar een array en dan de verdiensten voor januari van het eerste jaar krijgen:
earnings = np.array(earnings)earnings
500
We kunnen ook de vorm van de array vinden:
earnings.shape
(2, 4, 3)
Indexeren en slicen werken precies hetzelfde met een 3-dimensionale array, maar nu hebben we een extra as om door te geven. Als we de winst over januari van alle jaren willen krijgen, kunnen we dit doen:
earnings
array()
Als we de winst over het eerste kwartaal van beide jaren willen krijgen, kunnen we dit doen:
earnings
array(,])
Door meer dimensies toe te voegen, wordt het veel gemakkelijker om uw gegevens te doorzoeken als ze op een bepaalde manier zijn georganiseerd. Als we van 3-dimensionale arrays naar 4-dimensionale en grotere arrays gaan, gelden dezelfde eigenschappen, en ze kunnen op dezelfde manieren worden geïndexeerd en gesneden.
NumPy Data Types
Zoals we al eerder zeiden, kan elke NumPy array elementen van een enkel gegevenstype opslaan. wines
bevat bijvoorbeeld alleen float-waarden. NumPy slaat waarden op met zijn eigen gegevenstypen, die verschillen van Python-typen zoals float
en str
. Dit komt omdat de kern van NumPy is geschreven in een programmeertaal genaamd C, die gegevens anders opslaat dan de Python datatypen. NumPy datatypen worden opgeslagen tussen Python en C, zodat we NumPy arrays kunnen gebruiken zonder conversieproblemen.
U kunt het datatype van een NumPy array vinden door de dtype eigenschap te gebruiken:
wines.dtype
dtype('float64')
NumPy heeft verschillende datatypen, die meestal overeenkomen met Python datatypen, zoals float
, en str
. U kunt een volledige lijst van NumPy-datatypen hier vinden, maar hier zijn een paar belangrijke:
-
float
– numerieke floating point data. -
int
– integer data. -
string
– character data. -
object
– Python-objecten.
Datatatatatypen eindigen bovendien met een achtervoegsel dat aangeeft hoeveel bits van het geheugen ze in beslag nemen. Dus int32
is een 32 bit integer datatype, en float64
is een 64
bit float datatype.
Converting Data Types
U kunt de numpy.ndarray.astype methode gebruiken om een array te converteren naar een ander type. De methode zal in feite de array kopiëren, en een nieuwe array teruggeven met het gespecificeerde datatype. We kunnen bijvoorbeeld wines
converteren naar het gegevenstype int
:
wines.astype(int)
array(,,,...,,,])
Zoals u hierboven kunt zien, zijn alle items in de resulterende array gehele getallen. Merk op dat we het Python int
type hebben gebruikt in plaats van een NumPy datatype bij het omzetten van wines
. Dit komt omdat verschillende Python datatypen, waaronder float
, int
, en string
, gebruikt kunnen worden met NumPy, en automatisch geconverteerd worden naar NumPy datatypen.
We kunnen de name eigenschap van het dtype van de resulterende array controleren om te zien naar welk datatype NumPy de resulterende array heeft gemapped:
int_wines = wines.astype(int)int_wines.dtype.name
'int64'
De array is geconverteerd naar een 64-bit integer datatype. Dit maakt zeer lange integer waarden mogelijk, maar neemt meer ruimte in het geheugen in beslag dan wanneer de waarden worden opgeslagen als 32-bits integers.
Als u meer controle wilt over hoe de array in het geheugen wordt opgeslagen, kunt u rechtstreeks NumPy dtype-objecten maken zoals numpy.int32:
np.int32
numpy.int32
Je kunt deze direct gebruiken om te converteren tussen types:
wines.astype(np.int32)
array(,,,...,,,], dtype=int32)
NumPy Array Operations
NumPy maakt het eenvoudig om wiskundige bewerkingen op arrays uit te voeren. Dit is een van de belangrijkste voordelen van NumPy, en maakt het vrij eenvoudig om berekeningen uit te voeren.
Single Array Math
Als je een van de basis wiskundige bewerkingen (/
, *
, -
, +
, ^
) uitvoert met een array en een waarde, zal het de bewerking toepassen op elk van de elementen in het array.
Laten we zeggen dat we 10
punten willen toevoegen aan elke kwaliteitsscore omdat we dronken zijn en ons gul voelen. Zo zouden we dat doen:
wines + 10
array()
Merk op dat de bovenstaande bewerking de wines
-array niet zal veranderen – het zal een nieuwe 1-dimensionale array teruggeven waar 10
is toegevoegd aan elk element in de kwaliteitskolom van wijnen.
Als we in plaats daarvan +=
zouden doen, zouden we de array in de plaats wijzigen:
wines += 10wines
array()
Alle andere bewerkingen werken op dezelfde manier. Als we bijvoorbeeld elke kwaliteitsscore willen vermenigvuldigen met 2
, kunnen we dat als volgt doen:
wines * 2
array()
Multiple Array Math
Het is ook mogelijk om wiskundige bewerkingen tussen arrays uit te voeren. Dit zal de bewerking toepassen op paren van elementen. Als we bijvoorbeeld de kolom quality
bij zichzelf optellen, krijgen we het volgende:
wines + wines
array()
Merk op dat dit gelijkwaardig is aan wines * 2
– dit komt omdat NumPy elk paar elementen optelt. Het eerste element in de eerste array wordt opgeteld bij het eerste element in de tweede array, het tweede bij het tweede, enzovoort.
We kunnen dit ook gebruiken om arrays te vermenigvuldigen. Laten we zeggen dat we een wijn willen kiezen die het alcoholgehalte en de kwaliteit maximaliseert (we willen dronken worden, maar we zijn stijlvol). We vermenigvuldigen alcohol
met quality
, en kiezen de wijn met de hoogste score:
wines * wines
array()
Alle gebruikelijke bewerkingen (/
, *
, -
, +
, ^
) werken tussen arrays.
Broadcasting
Niet als de arrays waarop je werkt exact even groot zijn, is het niet mogelijk om elementgewijze bewerkingen uit te voeren. In dat geval voert NumPy broadcasting uit om te proberen de elementen bij elkaar te brengen. In wezen omvat broadcasting een paar stappen:
- De laatste dimensie van elke array wordt vergeleken.
- Als de dimensielengte gelijk is, of een van de dimensies heeft lengte
1
, dan gaan we door. - Als de dimensielengte niet gelijk is, en geen van de dimensies heeft lengte
1
, dan treedt er een fout op.
- Als de dimensielengte gelijk is, of een van de dimensies heeft lengte
- Ga door met het controleren van dimensies totdat de kortste array geen dimensies meer heeft.
De volgende twee vormen zijn bijvoorbeeld compatibel:
A: (50,3)B (3,)
Dit komt omdat de lengte van de achterste dimensie van array A
3
is, en de lengte van de achterste dimensie van array B
is 3
. Ze zijn gelijk, dus die dimensie is in orde. Array B
heeft dan geen elementen meer, dus we zitten goed, en de arrays zijn compatibel voor wiskundige bewerkingen.
De volgende twee vormen zijn ook compatibel:
A: (1,2)B (50,2)
De laatste dimensie komt overeen, en A
heeft in de eerste dimensie de lengte 1
.
Deze twee matrices komen niet overeen:
A: (50,50)B: (49,49)
De lengtes van de dimensies zijn niet gelijk, en geen van beide matrices heeft een dimensielengte gelijk aan 1
.
Er staat hier een gedetailleerde uitleg van het uitzenden, maar we zullen een paar voorbeelden doorlopen om het principe te illustreren:
wines * np.array()
------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython -input-40-821086ccaf65> in <module>()----> 1 wines * np.array()ValueError: operands could not be broadcast together with shapes (1599,12) (2,)</module></ipython>
Het bovenstaande voorbeeld werkte niet, omdat de twee matrices geen overeenkomende achterste dimensie hebben. Hier is een voorbeeld waar de laatste dimensie wel overeenkomt:
array_one = np.array( , ])array_two = np.array()array_one + array_two
array(,])
Zoals u kunt zien, is array_two
uitgezonden over elke rij van array_one
. Hier is een voorbeeld met onze wines
-gegevens:
rand_array = np.random.rand(12)wines + rand_array
array(,,,...,,,])
Elementen van rand_array
worden uitgezonden over elke rij van wines
, dus de eerste kolom van wines
krijgt de eerste waarde in rand_array
erbij, enzovoort.
NumPy Array Methods
Naast de gebruikelijke wiskundige bewerkingen heeft NumPy ook verschillende methoden die u kunt gebruiken voor complexere berekeningen op arrays. Een voorbeeld hiervan is de numpy.ndarray.sum methode. Deze vindt standaard de som van alle elementen in een array:
wines.sum()
9012.0
Het totaal van al onze kwaliteitsbeoordelingen is 154.1788
. We kunnen het sleutelwoordargument axis
doorgeven aan de methode sum
om sommen over een as te vinden. Als we sum
aanroepen over de matrix wines
, en axis=0
doorgeven, vinden we de sommen over de eerste as van de matrix. Dit geeft ons de som van alle waarden in elke kolom. Het lijkt misschien omgekeerd dat de sommen over de eerste as ons de som van elke kolom zouden geven, maar één manier om hierover na te denken is dat de gespecificeerde as degene is die “weggaat”. Dus als we axis=0
specificeren, willen we dat de rijen weggaan, en we willen de sommen vinden voor elk van de resterende assen over elke rij:
wines.sum(axis=0)
array()
We kunnen controleren of we de som correct hebben gemaakt door de vorm te controleren. De vorm moet 12
zijn, overeenkomend met het aantal kolommen:
wines.sum(axis=0).shape
(12,)
Als we axis=1
invoeren, vinden we de sommen over de tweede as van de matrix. Dit geeft ons de som van elke rij:
wines.sum(axis=1)
array()
Er zijn verschillende andere methoden die zich gedragen als de methode sum
, waaronder:
- numpy.ndarray.mean – vindt het gemiddelde van een array.
- numpy.ndarray.std – vindt de standaardafwijking van een array.
- numpy.ndarray.min – vindt de minimumwaarde in een array.
- numpy.ndarray.max – vindt de maximale waarde in een array.
Een volledige lijst van array methods vindt u hier.
NumPy Array Comparisons
NumPy maakt het mogelijk om te testen of rijen overeenkomen met bepaalde waarden met behulp van wiskundige vergelijkingsoperaties zoals <
, >
, >=
, <=
, en ==
. Als we bijvoorbeeld willen zien welke wijnen een kwaliteitsbeoordeling hebben die hoger is dan 5
, kunnen we dit doen:
wines > 5
array(, dtype=bool)
We krijgen een Booleaanse matrix die ons vertelt welke van de wijnen een kwaliteitsbeoordeling hebben die hoger is dan 5
. We kunnen iets soortgelijks doen met de andere operatoren. Zo kunnen we bijvoorbeeld zien of er wijnen zijn met een kwaliteitsbeoordeling gelijk aan 10
:
wines == 10
array(, dtype=bool)
Subsetting
Een van de krachtige dingen die we kunnen doen met een Boolean array en een NumPy array is het selecteren van alleen bepaalde rijen of kolommen in de NumPy array. De onderstaande code selecteert bijvoorbeeld alleen rijen in wines
waar de kwaliteit hoger is dan 7
:
high_quality = wines > 7wines
array(,,])
We selecteren alleen de rijen waar high_quality
een True
waarde bevat, en alle kolommen. Deze subsetting maakt het eenvoudig om arrays te filteren op bepaalde criteria. We kunnen bijvoorbeeld zoeken naar wijnen met veel alcohol en van hoge kwaliteit. Om meerdere voorwaarden op te geven, moeten we elke voorwaarde tussen haakjes plaatsen, en de voorwaarden scheiden met een ampersand (&
):
high_quality_and_alcohol = (wines > 10) & (wines > 7)wines
array(,,,,,,,,,,,,,,,])
We kunnen subsetting en toewijzing combineren om bepaalde waarden in een array te overschrijven:
high_quality_and_alcohol = (wines > 10) & (wines > 7)wines = 20
Reshaping NumPy Arrays
We kunnen de vorm van arrays veranderen terwijl alle elementen behouden blijven. Dit maakt het vaak makkelijker om array elementen te benaderen. De eenvoudigste vormverandering is het omdraaien van de assen, zodat rijen kolommen worden, en vice versa. We kunnen dit bereiken met de functie numpy.transpose:
np.transpose(wines).shape
(12, 1599)
We kunnen de functie numpy.ravel gebruiken om een array in een eendimensionale weergave te veranderen. Het zal in wezen een array afvlakken in een lange reeks van waarden:
wines.ravel()
array()
Hier is een voorbeeld waar we de volgorde van numpy.ravel
kunnen zien:
array_one = np.array( , ])array_one.ravel()
array()
Ten slotte kunnen we de numpy.reshape functie gebruiken om een array een bepaalde vorm te geven die we specificeren. De onderstaande code zal de tweede rij van wines
veranderen in een 2-dimensionale array met 2
rijen en 6
kolommen:
wines.reshape((2,6))
array(,])
Combining NumPy Arrays
Met NumPy is het heel gebruikelijk om meerdere arrays te combineren tot een enkele geünificeerde array. We kunnen numpy.vstack gebruiken om meerdere arrays verticaal te stapelen. Zie het als de items van de tweede array die worden toegevoegd als nieuwe rijen aan de eerste array. We kunnen de dataset winequality-white.csv
inlezen die informatie bevat over de kwaliteit van witte wijnen, en deze vervolgens combineren met onze bestaande dataset, wines
, die informatie bevat over rode wijnen.
In de onderstaande code, we:
- Lezen in
winequality-white.csv
. - Weergave van de vorm van
white_wines
.
white_wines = np.genfromtxt("winequality-white.csv", delimiter=";", skip_header=1)white_wines.shape
(4898, 12)
Zoals u kunt zien, hebben we attributen voor 4898
wijnen. Nu we de gegevens van de witte wijnen hebben, kunnen we alle wijngegevens combineren.
In de onderstaande code, we:
- Gebruik de
vstack
functie omwines
enwhite_wines
te combineren. - Weergave van de vorm van het resultaat.
all_wines = np.vstack((wines, white_wines))all_wines.shape
(6497, 12)
Zoals u kunt zien, heeft het resultaat 6497
rijen, wat de som is van het aantal rijen in wines
en het aantal rijen in red_wines
.
Als we arrays horizontaal willen combineren, waarbij het aantal rijen constant blijft, maar de kolommen worden samengevoegd, dan kunnen we de numpy.hstack functie gebruiken. De arrays die we combineren moeten hetzelfde aantal rijen hebben om dit te laten werken.
Ten slotte kunnen we numpy.concatenate gebruiken als een algemene versie van hstack
en vstack
. Als we twee arrays aan elkaar willen plakken, geven we ze door aan concatenate
, en specificeren dan het axis
sleutelwoordargument waarlangs we willen concateneren. Aaneenschakelen langs de eerste as is vergelijkbaar met vstack
, en aaneenschakelen langs de tweede as is vergelijkbaar met hstack
:
np.concatenate((wines, white_wines), axis=0)
array(,,,...,,,])
Gratis NumPy Cheat Sheet
Als u meer wilt leren over NumPy, bekijk dan onze interactieve cursus over NumPy en Pandas. Je kunt je registreren en de eerste missies gratis doen.
Je kunt je NumPy-vaardigheden ook naar een hoger niveau tillen met ons gratis NumPy-spiekbriefje!
Verder lezen
Je zou nu een goed begrip moeten hebben van NumPy, en hoe je het kunt toepassen op een dataset.
Als u er dieper in wilt duiken, zijn hier enkele bronnen die nuttig kunnen zijn:
- NumPy Quickstart – bevat goede codevoorbeelden en behandelt de meeste basisfuncties van NumPy.
- Python NumPy Tutorial – een goede tutorial over NumPy en andere Python-bibliotheken.
- Visual NumPy Introduction – een gids die het spel van het leven gebruikt om NumPy-concepten te illustreren.
In onze volgende tutorial duiken we meer in Pandas, een bibliotheek die voortbouwt op NumPy en gegevensanalyse nog eenvoudiger maakt. Het lost twee van de grootste pijnpunten op, namelijk:
- Je kunt niet meerdere gegevenstypen in een array mixen.
- Je moet onthouden welk gegevenstype elke kolom bevat.
Vik is de CEO en oprichter van Dataquest.