NumPy-arrays en gevectoriseerd rekenen
GemiddeldLes 1 van 8 in Cursus Data-analyse met Python: NumPy, pandas en visualisatie
Wat je leert
- Maak NumPy-arrays uit Python-gegevens en met de aanmaakfuncties van NumPy, beschrijf een array aan de hand van de vorm en het datatype en kies en converteer datatypes zonder onbedoeld informatie te verliezen.
- Leg uit wat een NumPy-array is en hoe die verschilt van een lijstBeschrijf een array aan de hand van het aantal dimensies, de vorm, het aantal elementen en het datatype, en leg uit waarom arrays zich anders gedragen en anders presteren dan Python-lijsten.
- Maak arrays uit lijsten en met de aanmaakfuncties van NumPyZet lijsten om in arrays en maak gevulde arrays, getallenreeksen en rasters met gelijkmatig verdeelde punten in de vorm en met het type dat je nodig hebt.
- Kies, controleer en converteer datatypesLees het datatype van een array af en stel het in, voorspel welk type NumPy kiest en converteer tussen types zonder afkappen, overloop en verlies van ontbrekende waarden.
- Leg uit wat een NumPy-array is en hoe die verschilt van een lijst
- Selecteer afzonderlijke waarden, rijen, kolommen en blokken, selecteer met lijsten van posities of met voorwaarden en bepaal wanneer een selectie gegevens deelt met de oorspronkelijke array.
- Gebruik indexering en deelbereiken in een- en tweedimensionale arraysGebruik posities en deelbereiken, één per as, om elementen, rijen, kolommen en blokken te lezen en te wijzigen.
- Selecteer met lijsten van posities en onderscheid weergaven van kopieënSelecteer willekeurige elementen, rijen of kolommen met arrays van gehele getallen en voorspel of een resultaat geheugen deelt met de oorspronkelijke array.
- Filter op voorwaarden met booleaanse maskers en np.whereMaak waar-of-onwaar-maskers met vergelijkingen, combineer ze en gebruik ze om waarden te filteren, tellen, vervangen en kiezen.
- Gebruik indexering en deelbereiken in een- en tweedimensionale arrays
- Rangschik dezelfde waarden in een nieuwe vorm, verwissel rijen en kolommen, voeg assen met lengte 1 toe of verwijder ze, en voeg arrays samen of splits ze op langs een as.
- Wijzig de vorm van een array en verwissel de assenWijzig de vorm van arrays, vlak ze af en transponeer ze, en voeg assen met lengte 1 toe of verwijder ze. Voorspel daarbij de volgorde van de waarden.
- Voeg arrays samen en splits ze opCombineer arrays langs een bestaande of een nieuwe as en splits een array in stukken, waarbij je controleert of de vormen passen.
- Wijzig de vorm van een array en verwissel de assen
- Schrijf berekeningen voor volledige arrays in plaats van lussen die element voor element werken, pas de universele functies van NumPy toe en combineer arrays met verschillende vormen volgens de broadcastingregels.
- Reken elementsgewijs in plaats van met lussenGebruik reken- en vergelijkingsoperatoren op volledige arrays en weet hoe ze omgaan met vormen, deling door nul en wijzigingen in het bestaande geheugen.
- Pas universele functies toe op volledige arraysGebruik de elementsgewijze wiskundige functies van NumPy, waaronder afronding en functies voor twee arrays, en verwerk waarden buiten het domein van een functie.
- Combineer arrays met verschillende vormen via broadcastingPas de broadcastingregels toe om te voorspellen of twee vormen te combineren zijn en welke vorm het resultaat krijgt, en los vormfouten op door een as toe te voegen.
- Reken elementsgewijs in plaats van met lussen
- Reduceer arrays tot totalen, gemiddelden, uitersten, spreidingsmaten, medianen en aantallen, voor de hele array of langs een gekozen as, en verwerk ontbrekende waarden en deelverzamelingen correct.
- Aggregeer een volledige array of langs één asBereken sommen, gemiddelden, uitersten, posities, cumulatieve totalen en spreidingsmaten voor de hele array of per rij of kolom, en voorspel de vorm van het resultaat.
- Gebruik medianen, percentielen, sortering en unieke waardenBeschrijf het centrum en de spreiding van gegevens met statistische maten op basis van de volgorde, sorteer waarden en bijbehorende arrays en tel unieke waarden.
- Vat gegevens samen met aandacht voor ontbrekende waarden en voorwaardenZoek, tel, verwijder en vul ontbrekende waarden aan, gebruik aggregaties die NaN-waarden overslaan en vat alleen de waarden samen die aan een voorwaarde voldoen of tot een groep behoren.
- Aggregeer een volledige array of langs één as
- Maak een toevalsgenerator met een startwaarde, trek reproduceerbare steekproeven uit veelgebruikte verdelingen, schud gegevens en trek er steekproeven uit, en schat resultaten met gevectoriseerde simulaties.
- Trek reproduceerbare aselecte steekproeven met een GeneratorMaak een Generator met een startwaarde, trek gehele en decimale getallen, waarden uit een normale verdeling en steekproeven uit een lijst, schud gegevens en zorg dat resultaten reproduceerbaar blijven.
- Voer gevectoriseerde simulaties uitSchat kansen en gedrag op lange termijn door alle toevalswaarden tegelijk te trekken en ze met arraybewerkingen samen te vatten.
- Trek reproduceerbare aselecte steekproeven met een Generator
NumPy-arrays: uitleg
1Maak arrays en bepaal hun datatypes
Numerieke gegevens zijn makkelijker te verwerken als hun structuur en opslagtype duidelijk zijn. Maak arrays uit bestaande waarden of op basis van een geplande vorm en lees vervolgens hun dimensies, aantal elementen en datatype af. Kies aanmaakfuncties die bij je invoer passen en bekijk hoe conversie, afronding, overloop en ontbrekende waarden beïnvloeden wat de array daadwerkelijk opslaat. Deze keuzes bepalen of latere berekeningen de informatie behouden die je nodig hebt.
1.1 Leg uit wat een NumPy-array is en hoe die verschilt van een lijst
NumPy slaat numerieke gegevens op in arrays, zodat één expressie op veel waarden kan werken. Importeer NumPy met import numpy as np; de korte naam np is de gebruikelijke manier om de functies aan te roepen.
Lees de structuur van een array af
Een ndarray is een rechthoekig raster waarvan de elementen één datatype delen. Een dimensie wordt ook een as genoemd. Begin met een kleine tabel:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
De attributen beantwoorden vier verschillende vragen:
| Attribuut | Betekenis | Waarde voor a |
|---|---|---|
ndim | Aantal assen | 2 |
shape | Lengte van elke as | (2, 3) |
size | Totaal aantal elementen | 6 |
dtype | Type van elk element | Meestal int64 op een 64-bitscomputer |
As 0 indexeert rijen; as 1 indexeert kolommen. Een gegevenstabel met één rij per persoon en kolommen voor lengte, massa en leeftijd heeft voor 100 personen vorm (100, 3). Het product van de waarden in de vorm geeft het aantal elementen.
Een vector heeft geen rij- of kolomas
np.array([2, 4, 6, 8]) heeft vorm (4,) en één as. De komma maakt hiervan een tuple met één item. Vorm (1, 4) heeft twee assen: één rij en vier kolommen. Vorm (4, 1) heeft ook twee assen, maar vier rijen en één kolom. Deze arrays bevatten vier waarden, maar gedragen zich anders als je ze met andere arrays combineert. np.array(7) is een nuldimensionale array: de vorm is () en de ndim is 0.
Arrays veranderen de betekenis van operatoren
Een lijst is een algemene Python-container. Een array is ontworpen voor berekeningen op overeenkomstige posities.
| Expressie | Resultaat |
|---|---|
[1, 2, 3] * 2 | [1, 2, 3, 1, 2, 3] |
np.array([1, 2, 3]) * 2 | array([2, 4, 6]) |
[1, 2] + [3, 4] | [1, 2, 3, 4] |
np.array([1, 2]) + np.array([3, 4]) | array([4, 6]) |
Bij het optellen van de arrays wordt 1 gekoppeld aan 3 en 2 aan 4. Het aantal elementen van de array blijft gelijk.
Waarom numerieke arrays efficiënt zijn
Een nieuw gemaakte numerieke array slaat waarden van hetzelfde type bij elkaar op in het geheugen. NumPy doorloopt deze waarden in gecompileerde code en vermijdt zo een afzonderlijke bewerking op Python-niveau voor elk getal. Een miljoen float64-waarden nemen 8.000.000 bytes aan elementopslag in. Bij een array van die omvang kun je dit aflezen met a.nbytes. Een Python-lijst slaat ook verwijzingen naar Python-objecten op en heeft daardoor aanzienlijk meer ruimte nodig. De prestatiewinst hangt af van de berekening en de computer.
Het aantal elementen van een array groeit niet door een append-methode in het bestaande geheugen. np.append(a, value) reserveert geheugen voor een nieuwe array. Voor gegevens die je één waarde tegelijk verzamelt, maak je een Python-lijst die je één keer converteert. Geneste invoer moet rechthoekig zijn: np.array([[1, 2], [3]]) geeft een ValueError omdat de rijlengtes verschillen.
Herken weergegeven resultaten
print(np.array([1, 2, 3])) toont [1 2 3]. Een interactieve weergave gebruikt array([1, 2, 3]). Voor np.array([5, 6])[0] op een 64-bitscomputer toont NumPy 2 np.int64(5); deze waarde neemt als het getal 5 deel aan berekeningen.
Belangrijkste punten
- De vorm geeft de lengte van elke as; het aantal elementen telt alle elementen.
- Een 1-dimensionale vorm zoals
(4,)verschilt van een 2-dimensionale rij of kolom. - Arrayberekeningen werken op waarden op overeenkomstige posities.
- Numerieke arrays slaan één datatype op en ondersteunen efficiënte gecompileerde berekeningen.
- Geneste invoer moet rijen van gelijke lengte hebben.
1.2 Maak arrays uit lijsten en met de aanmaakfuncties van NumPy
Kies een aanmaakfunctie door na te gaan wat je weet: de daadwerkelijke waarden, een vorm en vulwaarde, een stapgrootte of een vereist aantal punten. Die keuze laat de code uitdrukken hoe de gegevens moeten worden opgebouwd.
Begin met waarden of een vorm
np.array([3, 1, 4]) maakt een vector. Een lijst van even lange lijsten maakt een tabel. Geef de waarden als één reeks door; met np.array(1, 2, 3) geef je de drie elementen niet correct op.
| Functie | Voorbeeld | Wat de functie maakt |
|---|---|---|
np.zeros | np.zeros((3, 4)) | Drie rijen van vier nullen |
np.ones | np.ones((2, 3)) | Twee rijen van drie enen |
np.full | np.full((2, 2), 7) | Een 2×2-array gevuld met 7 |
np.empty | np.empty((3, 4)) | Gereserveerde, niet-geïnitialiseerde opslag |
Bij een multidimensionale vorm zijn de haakjes belangrijk. np.zeros((2, 3)) geeft één tuple door. Bij np.zeros(2, 3) geeft Python 3 door als argument voor het datatype, wat een typefout veroorzaakt. Nullen en enen gebruiken standaard float64; full leidt het datatype af uit de vulwaarde. Voeg dtype=int toe als je opslag voor gehele getallen nodig hebt.
empty garandeert geen nullen of betekenisvolle beginwaarden. Lees de array pas nadat je elk element dat je gaat gebruiken een waarde hebt gegeven. zeros is een eenvoudigere keuze als een beginwaarde van nul betekenis heeft.
Kies een stap of een aantal punten
np.arange(start, stop, step) volgt hetzelfde principe van stappen als range van Python. np.arange(2, 11, 3) geeft [2 5 8]: begin bij 2 en tel steeds 3 op zolang je onder 11 blijft. Met één argument begint np.arange(5) bij 0 en geeft de functie [0 1 2 3 4].
Stappen met drijvendekommagetallen kunnen verrassende eindpunten opleveren. Zo bevat np.arange(1, 1.3, 0.1) de weergegeven waarde 1,3 omdat binaire afronding de berekening van de reeks beïnvloedt. Gebruik voor een decimaal raster met een vast aantal punten linspace:
grid = np.linspace(0, 1, 5)
# array([0. , 0.25, 0.5 , 0.75, 1. ])
Beide eindpunten worden standaard meegenomen. Vijf punten maken vier tussenruimtes. Tien punten tussen 0 en 1 maken negen tussenruimtes, dus hun afstand is ongeveer 0,111; voor stappen van 0,1 zijn 11 punten nodig.
Gebruik een bestaande structuur opnieuw
np.zeros_like(a), np.ones_like(a) en np.full_like(a, value) maken nieuwe arrays met de vorm en het datatype van a. Het overgenomen datatype is van belang: als je een sjabloon met gehele getallen vult met een decimaal getal, kan het decimale deel verloren gaan tenzij je om een drijvendekommatype vraagt. np.eye(3) maakt een vierkante eenheidsmatrix met enen op de diagonaal en elders nullen.
Reserveer één keer geheugen voor een gegevenstabel
Voor neerslag in millimeters op drie meetstations gedurende vier weken:
rain = np.zeros((3, 4))
rain[0] = [12.0, 0.0, 5.5, 8.0]
De eerste toekenning vult één rij en behoudt vorm (3, 4). Als het aantal metingen bekend is, voorkom je door geheugen voor de volledige tabel te reserveren dat je herhaaldelijk geheugen voor grotere arrays moet reserveren. Als de hoeveelheid invoer onbekend is, verzamel je waarden in een lijst en roep je np.array aan zodra het verzamelen klaar is.
Belangrijkste punten
- Geef een multidimensionale vorm door als tuple.
arangegeeft een stap op;linspacegeeft een aantal punten op.linspaceneemt standaard beide eindpunten mee.emptymoet worden gevuld voordat de waarden worden gebruikt.- De like-functies nemen zowel de vorm als het datatype over.
- Reserveer één keer geheugen voor een bekende uiteindelijke vorm.
1.3 Kies, controleer en converteer datatypes
Het datatype van een array bepaalt wat die kan opslaan en hoeveel geheugen elke waarde nodig heeft. Door het juiste type te kiezen voorkom je ook dat berekeningen ongemerkt informatie verliezen.
Controleer het opslagtype
int64 bevat 64-bits gehele getallen, float64 bevat binaire drijvendekommagetallen en bool bevat waar-of-onwaarwaarden. Unicode-datatypes zoals <U5 slaan tekst op met een maximaal aantal tekens. a.itemsize is het aantal bytes per element; a.nbytes is a.size * a.itemsize. Een float64 gebruikt 8 bytes en heeft een precisie van ongeveer 15 significante decimale cijfers.
Op doorsnee 64-bitscomputers gebruikt invoer van gehele getallen 64-bits gehele getallen. NumPy 2 gebruikt die standaard ook op 64-bits Windows. Decimale invoer geeft normaal gesproken float64.
Automatische typeafleiding kiest één gedeeld type
np.array([1, 2.5]) wordt [1. 2.5]: het gehele getal wordt weergegeven als float. np.array([True, 2]) wordt [1 2]. Als je getallen en tekst mengt, kan de hele array in tekst veranderen, zodat een label zoals 'n/a' latere berekeningen kan laten mislukken. Controleer dtype als gegevens die numeriek lijken niet kunnen worden opgeteld of vermenigvuldigd.
Converteer bewust
astype geeft een geconverteerde kopie terug:
x = np.array([1.7, -1.7, 2.5])
whole = x.astype(int)
# array([ 1, -1, 2])
Deze conversie kapt af richting nul; die rondt niet af. np.round(x).astype(int) geeft [2 -2 2] omdat exacte halven worden afgerond naar het dichtstbijzijnde even getal. Tekst zoals '1.5' kan met astype(float) worden geconverteerd, maar 'n/a' geeft een ValueError. Schoon plaatsvervangende waarden op vóór de conversie.
Toekenningen gebruiken het datatype van de bestemming. Na a = np.array([1, 2, 3]) slaat de toekenning a[0] = 9.9 zonder waarschuwing 9 op. Als je eerst de hele array naar float converteert, kunnen latere toekenningen decimalen behouden.
Gehele getallen met een vaste breedte kunnen overlopen
Een int8 bevat waarden van −128 tot en met 127; een uint8 bevat 0 tot en met 255. Als je twee uint8-arrays met 250 en 10 optelt, krijg je door terugloop 4. Als je een int8-array met 100 vermenigvuldigt met 2, krijg je −56. Een geheel Python-getal dat niet in het arraytype past, zoals 300 opgeteld bij een int8-array in NumPy 2, geeft daarentegen een OverflowError. Zet kleine geheelgetaltypes om naar ruimere types voordat je berekeningen uitvoert die buiten hun bereik kunnen komen.
Delen en benaderde decimale getallen
| Bewerking | Voorbeeld | Resultaat |
|---|---|---|
| Gewone deling | np.array([7, 8]) / 2 | [3.5 4.] |
| Geheeltallige deling naar beneden | np.array([7, -7]) // 2 | [3 -4] |
| Rest | np.array([7, -7]) % 2 | [1 1] |
Geheeltallige deling rondt naar beneden af, richting min oneindig. Bij negatieve resultaten verschilt dit van afkappen. Gewone deling geeft bij gehele invoer drijvendekommaresultaten terug.
Veel decimale breuken zijn binair opgeslagen benaderingen. 0.1 + 0.2 == 0.3 is onwaar; np.isclose vergelijkt overeenkomstige waarden met een tolerantie en np.allclose geeft één antwoord voor de hele array.
De markering voor ontbrekende waarden np.nan is een drijvendekommawaarde. Arrays met gehele getallen kunnen die niet opslaan. np.array([1, 2, np.nan]) wordt daarom een array met drijvendekommagetallen; ontbrekende waarden naar gehele getallen converteren herstelt ze niet en kan betekenisloze resultaten opleveren.
Belangrijkste punten
- Eén datatype geldt voor elk element, ook voor waarden die later worden toegekend.
astype(int)kapt af richting nul; afronden is een afzonderlijke stap.- Kleine gehele getallen met een vaste breedte kunnen tijdens berekeningen overlopen.
- Gebruik vergelijkingen met een tolerantie voor benaderde decimale getallen.
- NaN heeft een drijvendekommatype nodig.
2Selecteer en filter gegevens in arrays
Voor een analyse heb je zelden elke waarde in precies de oorspronkelijke volgorde nodig. Selecteer afzonderlijke posities, regelmatige deelbereiken, willekeurige records of items die aan een voorwaarde voldoen. Ga voordat je een resultaat wijzigt na of het geheugen deelt met de bron. Met booleaanse maskers kun je vervolgens dezelfde selectieregel gebruiken voor filteren, vervangen, aantallen en aandelen, terwijl je volledige records behoudt als je vraag daarom vraagt.
2.1 Gebruik indexering en deelbereiken in een- en tweedimensionale arrays
Met indexering zoek je waarden op positie. Met deelbereiken selecteer je een regelmatige reeks posities. Schrijf in een tabel voor elke as een selector, zodat de code aangeeft welke rijen en welke kolommen je nodig hebt.
Lees een vector
Voor a = np.array([10, 20, 30, 40, 50]) bevat positie 0 de waarde 10 en positie −1 de waarde 50. Een deelbereik heeft de vorm start:stop:step, waarbij de stoppositie is uitgesloten:
| Selectie | Resultaat |
|---|---|
a[1:4] | [20 30 40] |
a[::2] | [10 30 50] |
a[::-1] | [50 40 30 20 10] |
a[3:10] | [40 50] |
Als je start of stop weglaat, loopt het bereik door tot het betreffende uiteinde. Een deelbereik kan buiten de array lopen en wordt dan automatisch ingekort. Eén ongeldige positie, zoals a[5], geeft een IndexError.
Geef elke tabelas een eigen selector
m = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
m[1, 2] leest rij 1, kolom 2 en geeft 6. De komma scheidt de assen. Een dubbele punt op zichzelf selecteert de volledige as: m[0, :] geeft de eerste rij [1 2 3] en m[:, 1] geeft de tweede kolom [2 5 8]. Voor een blok selecteert m[:2, 1:] de rijen 0 en 1 en de kolommen 1 en 2, wat [[2 3] [5 6]] geeft.
Behandel herhaalde indexering met vierkante haken niet als uitwisselbaar met indexering met een komma. m[1][2] vindt toevallig dezelfde scalaire waarde als m[1, 2]. Maar m[:][0] neemt eerst alle rijen en selecteert daarna de eerste rij. Het selecteert niet de eerste kolom; dat doet m[:, 0].
Voorspel welke assen overblijven
Een selector met één gehele index verwijdert de bijbehorende as. Een deelbereik behoudt de as, ook als maar één positie is geselecteerd. Zo heeft m[:, 1] vorm (3,), terwijl m[:, 1:2] vorm (3, 1) heeft. Beide selecteren 2, 5 en 8, maar alleen de tweede behoudt een kolomas. Dit verschil wordt belangrijk als je arrays met andere vormen aftrekt of vermenigvuldigt.
Dezelfde regel geldt ook buiten tabellen. Als t.shape gelijk is aan (2, 3, 4), heeft t[0] vorm (3, 4), heeft t[0, 1] vorm (4,) en heeft t[:, :, 0] vorm (2, 3). Assen aan het eind die in de index zijn weggelaten, worden volledig geselecteerd.
Wijzig de geselecteerde posities
Een toekenning via een index schrijft in de bestaande array. a[1:3] = 0 vervangt beide geselecteerde waarden door nul; de scalaire waarde wordt op de hele selectie toegepast. m[0] = [0, 0, 0] vervangt een volledige rij. De toegekende waarden moeten passen bij de vorm van de selectie en worden geconverteerd naar het datatype ervan.
Voor vier leerlingen en drie toetsen:
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores[2] is de uitvoer [88 91 95] van de derde leerling. scores[:, -1] geeft de resultaten van de laatste toets [92 58 95 80]. scores[1:3, :2] geeft [[64 70] [88 91]]: twee leerlingen, elk met behoud van twee toetskolommen.
Belangrijkste punten
- Indexen beginnen bij 0; negatieve indexen tellen vanaf het einde.
- Deelbereiken sluiten de stoppositie uit en kunnen bij een arraygrens worden ingekort.
- Gebruik door komma's gescheiden selectors voor afzonderlijke assen.
- Een gehele index verwijdert een as; een deelbereik behoudt die.
- Een toekenning via een index wijzigt de geselecteerde waarden.
2.2 Selecteer met lijsten van posities en onderscheid weergaven van kopieën
Een selectie kan gegevens delen met de oorspronkelijke array of eigen, onafhankelijke gegevens hebben. Als je weet welke van de twee je hebt, voorkom je dat wijzigingen in een kleine selectie onverwacht een grotere tabel veranderen.
Onderscheid een alias, een weergave en een kopie
| Code | Relatie | Effect van een wijziging in b |
|---|---|---|
b = a | Twee namen voor één object | Wijzigt a |
b = a[2:5] | Een weergave van een deelbereik die gegevens deelt | Wijzigt het overeenkomstige deel van a |
b = a[2:5].copy() | Onafhankelijke gegevens | Laat a ongewijzigd |
Voor a = np.arange(6) en b = a[2:5] maakt de toekenning b[0] = 99 de array a gelijk aan [0 1 99 3 4 5]. De eerste positie van de weergave verwijst naar positie 2 in het origineel. Dit verschilt van een deelbereik van een Python-lijst, dat een nieuwe lijst maakt.
Kopieer voordat je wijzigingen aanbrengt als het origineel intact moet blijven. Een kleine bewaarde weergave kan ook een grote oorspronkelijke gegevensbuffer in het geheugen houden; door dat kleine deel te kopiëren, kan het zelfstandig bestaan.
Selecteer willekeurige posities
Indexering met indexarrays gebruikt een lijst of array van gehele getallen. Hiermee kun je posities in een andere volgorde zetten en herhalen:
a = np.array([10, 20, 30, 40, 50])
a[[4, 0, 0]]
# array([50, 10, 10])
Voor m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) selecteert m[[0, 2]] de eerste en derde rij. m[:, [2, 0]] selecteert de laatste en eerste kolom in die volgorde, wat [[3 1] [6 4] [9 7]] geeft.
Twee lijsten met gehele indexen in één index selecteren gepaarde coördinaten. m[[0, 2], [1, 2]] koppelt rij 0 aan kolom 1 en rij 2 aan kolom 2, wat [2 9] oplevert. Dit neemt niet alle combinaties. Gebruik het volgende om het blok van beide rijen en beide kolommen te krijgen:
m[np.ix_([0, 2], [1, 2])]
# array([[2, 3], [8, 9]])
Als je eerst de rijen en daarna de kolommen selecteert, m[[0, 2]][:, [1, 2]], krijg je hetzelfde blok.
Lezen en toekennen gedragen zich anders
Indexering met indexarrays en booleaanse filtering geven kopieën terug. Als c = a[[0, 1]], blijft a ongewijzigd wanneer je c[0] wijzigt. Maar a[[0, 1]] = -1 schrijft rechtstreeks naar die oorspronkelijke posities. Een opgeslagen selectie en een toekenning via een index zijn verschillende bewerkingen.
Dit verklaart ook waarom geketende wijzigingen de bron soms niet bereiken. In a[[0, 1]][0] = -1 is de eerste selectie al een tijdelijke kopie. De laatste schrijfbewerking wijzigt die tijdelijke array, niet a.
Controleer gedeeld geheugengebruik direct
np.shares_memory(x, y) controleert of twee arrays overlappen in het geheugen. De functie geeft waar terug voor een gewoon niet-leeg deelbereik en onwaar voor een kopie door indexering met indexarrays. Het attribuut base kan aangeven welk object eigenaar is van het onderliggende geheugen, maar hoeft niet de array aan te wijzen waaruit je het laatst een deelbereik nam. Als a = np.arange(6), b = a[2:5] en c = b[0:2], dan is c.base is a waar en c.base is b onwaar. Gebruik shares_memory als je specifiek wilt weten of twee arrays gegevens delen.
Belangrijkste punten
- Een toekenning maakt een alias voor een array; een gewoon deelbereik deelt de gegevens.
- Gebruik
.copy()voor een onafhankelijke selectie. - Indexering met indexarrays behoudt de gevraagde volgorde en staat herhalingen toe.
- Twee lijsten met gehele indexen koppelen coördinaten;
np.ix_selecteert alle combinaties. - Lezen met indexarrays maakt een kopie, maar directe toekenningen via indexen wijzigen de bron.
- Gebruik
np.shares_memoryom te controleren of arrays geheugen delen.
2.3 Filter op voorwaarden met booleaanse maskers en np.where
Een booleaans masker legt vast welke waarden aan een voorwaarde voldoen. Zodra een masker bestaat, kun je dezelfde waar-of-onwaarbeslissingen gebruiken om waarden te selecteren, gebeurtenissen te tellen of vervangende waarden te kiezen.
Maak een masker en pas het toe
t = np.array([18.5, 22.0, 15.2, 25.8, 21.1])
warm = t > 20
t[warm]
# array([22. , 25.8, 21.1])
De vergelijking levert [False True False True True] op. Booleaanse indexering behoudt de posities waar de waarde waar is en geeft een kopie terug. Een 1-dimensionaal masker dat op een as wordt gebruikt, moet dezelfde lengte hebben als die as.
Gebruik & voor en, | voor of en ~ voor niet om voorwaarden te combineren. Zet elke vergelijking tussen haakjes:
comfortable = (t > 18) & (t < 23)
t[comfortable]
# array([18.5, 22. , 21.1])
De Python-operatoren and en or proberen één waarheidswaarde uit een hele array te halen en dat mislukt bij arrays met meerdere elementen. Als je de haakjes weglaat, verandert ook hoe Python de expressie groepeert, omdat bitsgewijze operatoren vóór vergelijkingen worden toegepast.
Tel, meet of toets voorwaarden
True draagt 1 bij en False draagt 0 bij. warm.sum() is 3 en warm.mean() is 0,6, het aandeel dagen boven 20 °C. np.count_nonzero(warm) telt ook de items die waar zijn. warm.any() vraagt of minstens één dag warm is; warm.all() vraagt of elke dag warm is.
Deze bewerkingen beantwoorden andere vragen dan t[warm].mean(), dat de gemiddelde temperatuur op warme dagen berekent. Het gemiddelde van een masker meet een aandeel; het gemiddelde van geselecteerde metingen behoudt de eenheid van de meting.
Vervang waarden of kies tussen mogelijkheden
Een toekenning via een masker wijzigt de geselecteerde posities. Met t2 = t.copy() verhoogt de regel t2[t2 < 16] = 16 lage metingen tot 16. np.clip(t, 16, 25) geeft een nieuwe array terug die aan beide kanten is begrensd, [18.5 22. 16. 25. 21.1].
np.where(condition, x, y) maakt een nieuw resultaat met x op posities waar de voorwaarde waar is en y op posities waar die onwaar is. np.where(t > 20, 'warm', 'cool') levert op elke oorspronkelijke positie een label. Filteren maakt het resultaat daarentegen korter. Met alleen een voorwaarde geeft np.where(t > 20) een tuple van indexarrays terug, hier (array([1, 3, 4]),).
Behoud waarden of volledige records
Een masker met dezelfde vorm als een 2-dimensionale array haalt overeenkomende elementen op als één platte vector. In m[m > 5] gaat de rijstructuur verloren. Om hele records te behouden, leid je per rij één booleaanse waarde af uit een kolom:
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores[scores[:, 2] >= 90]
# array([[78, 85, 92], [88, 91, 95]])
Zoek ontbrekende waarden expliciet
NaN is bij vergelijking zelfs niet gelijk aan zichzelf. Gelijkheids- en volgordevergelijkingen met NaN zijn onwaar; ongelijkheid is waar. Daarom herkennen noch x == np.nan noch x != np.nan aanwezige en ontbrekende items correct. np.isnan(x) markeert ontbrekende posities en x[~np.isnan(x)] behoudt aanwezige waarden.
Belangrijkste punten
- Een masker bevat één waar-of-onwaarbeslissing per getoetste positie.
- Combineer vergelijkingen met
&,|en~en zet de vergelijkingen tussen haakjes. - De som van een masker telt het aantal overeenkomsten; het gemiddelde geeft hun aandeel.
- Gebruik een masker met de lengte van de rijas om hele records te filteren.
np.wherekiest op elke positie een waarde.- Gebruik
np.isnanom NaN te vinden.
3Wijzig de vorm van arrays, transponeer ze en voeg ze samen
Een bruikbare arrayvorm laat zien hoe gegevens bij elkaar horen: maanden binnen kwartalen, metingen binnen records of batches binnen een grotere verzameling. Rangschik waarden opnieuw door de vorm te wijzigen, verwissel de rollen van assen door te transponeren en voeg assen met lengte één toe als een vector de rol van rij of kolom moet krijgen. Door samen te voegen en op te splitsen kun je die groepen vervolgens combineren of scheiden, waarbij controles van de vorm de bedoelde structuur intact houden.
3.1 Wijzig de vorm van een array en verwissel de assen
Als je de vorm wijzigt, verandert de manier waarop waarden over assen zijn gegroepeerd. De vorm wijzigen, transponeren en een as toevoegen doen elk iets anders, ook als sommige dezelfde uiteindelijke vorm opleveren.
Wijzig de vorm zonder het aantal elementen te veranderen
a = np.arange(6)
r = a.reshape(2, 3)
# array([[0, 1, 2], [3, 4, 5]])
De standaardvolgorde vult steeds één rij: de laatste as verandert het snelst. Als je dezelfde waarden de vorm (3, 2) geeft, krijg je [[0 1] [2 3] [4 5]]. Het product van de nieuwe dimensies moet gelijk zijn aan het oorspronkelijke aantal elementen. Twaalf elementen passen in (3, 4), maar niet in (5, 3).
Eén dimensie kan -1 zijn, zodat NumPy de lengte ervan afleidt. np.arange(12).reshape(-1, 3) geeft vier rijen van drie; reshape(2, -1) geeft twee rijen van zes. Twee onbekende dimensies zijn niet toegestaan, omdat hun afzonderlijke lengtes niet alleen uit het totaal kunnen worden bepaald.
Transponeren verwisselt de assen
Voor r hierboven is r.T gelijk aan [[0 3] [1 4] [2 5]], met vorm (3, 2). Elke oorspronkelijke kolom is nu een rij. Die rangschikking verschilt van r.reshape(3, 2), hoewel de vormen van de resultaten gelijk zijn.
| Bewerking | Wat er met r gebeurt |
|---|---|
r.reshape(3, 2) | Leest waarden rij voor rij en groepeert ze opnieuw |
r.T | Verwisselt de rollen van rij en kolom |
Transponeren is handig als de volgende bewerking de omgekeerde asvolgorde nodig heeft. De vorm wijzigen is handig als een reeks al een betekenisvolle groepering heeft, zoals maanden die in kwartalen zijn gegroepeerd.
Transponeren maakt van een 1-dimensionale array geen kolom
v = np.arange(3) heeft maar één as, dus v.T heeft nog steeds vorm (3,). Voeg expliciet een as toe:
column = v[:, np.newaxis] # shape (3, 1)
row = v[np.newaxis, :] # shape (1, 3)
v.reshape(-1, 1) en np.expand_dims(v, 1) maken ook een kolom. np.squeeze(column) verwijdert de as met lengte één en geeft vorm (3,) terug. Een as toevoegen verandert geen waarden, maar bepaalt hoe ze bij latere berekeningen moeten worden uitgelijnd.
Afvlakken en gedeeld geheugengebruik
r.ravel() en r.flatten() geven beide de waarden in een 1-dimensionaal resultaat. ravel geeft waar mogelijk een weergave terug; flatten kopieert altijd. reshape(-1) is een andere manier om een 1-dimensionale rangschikking te vragen, maar of die geheugen deelt, hangt af van de indeling van de invoer. Bij het wijzigen van de vorm kan een kopie nodig zijn; transponeren deelt gegevens in de arrayweergave. Gebruik .copy() als onafhankelijke opslag nodig is.
Groepeer maandwaarden in kwartalen
Voor monthly = np.array([120, 135, 150, 160, 155, 170, 180, 175, 165, 150, 140, 130]) maakt monthly.reshape(4, 3) vier kwartaalrijen met elk drie maanden. Elke rij optellen met .sum(axis=1) geeft [405 485 520 420]. Het eerste totaal is 120 + 135 + 150 = 405. Het wijzigen van de vorm werkt omdat de chronologische invoer de maanden van elk kwartaal al bij elkaar zet.
Belangrijkste punten
- De vorm wijzigen behoudt het aantal elementen en volgt standaard de rijgewijze volgorde.
- Eén dimensie met
-1kan worden afgeleid. - Transponeren verwisselt de rollen van assen en kan verschillen van een vormwijziging met dezelfde uitkomstvorm.
- Gebruik een nieuwe as om van een vector een rij of kolom te maken.
flattenkopieert;ravelen het wijzigen van de vorm kunnen gegevens delen.
3.2 Voeg arrays samen en splits ze op
Samenvoegen combineert waarden uit meerdere arrays. Opsplitsen verdeelt één array in stukken. Bepaal eerst of de bewerking een bestaande as moet uitbreiden of een nieuwe as moet toevoegen.
Voeg samen langs een bestaande as
np.concatenate([a, b], axis=0) voegt vectoren achter elkaar samen. Samenvoegen van [1 2] met [3 4 5] geeft [1 2 3 4 5].
Voor twee arrays met elk vorm (2, 3) voegt as 0 rijen toe en geeft (4, 3). As 1 voegt kolommen toe en geeft (2, 6). Alleen de samenvoegas mag in lengte verschillen. Daarom kun je vormen (2, 3) en (2, 2) langs as 1 samenvoegen tot (2, 5), maar niet langs as 0, omdat hun aantallen kolommen verschillen.
Je moet de arrays samen als een reeks doorgeven, zoals [a, b]. Samenvoegen maakt een nieuwe gecombineerde array en kopieert de gegevens van de invoerarrays.
Stapel langs een nieuwe as
Voor p = np.array([1, 2, 3]) en q = np.array([4, 5, 6]):
| Expressie | Vorm | Rangschikking |
|---|---|---|
np.concatenate([p, q]) | (6,) | Eén langere vector |
np.stack([p, q]) | (2, 3) | Eén vector per rij |
np.stack([p, q], axis=1) | (3, 2) | Eén vector per kolom |
stack vereist gelijke invoervormen en voegt een as toe. concatenate behoudt het aantal assen. De hulpfuncties drukken veelgebruikte rangschikkingen uit: vstack([p, q]) maakt rijen, hstack([p, q]) voegt deze 1-dimensionale invoerarrays achter elkaar samen en column_stack([p, q]) maakt kolommen. Door het gedrag van hstack bij 1-dimensionale invoer is de naam alleen niet genoeg om een tabel te voorspellen.
Splits op grenzen of op aantal delen
np.split(np.arange(10), [3, 7]) splitst vóór posities 3 en 7 en levert [0 1 2], [3 4 5 6] en [7 8 9] op. De grensposities zijn geen lengtes van de delen.
Met een geheel getal als tweede argument vraag je juist om gelijke delen: np.split(x, 3) vraagt om drie gelijke stukken. Tien elementen kun je niet gelijk verdelen in drie stukken met een geheel aantal elementen, dus dit geeft een ValueError. np.array_split(np.arange(10), 3) staat ongelijke lengtes toe en levert 4, 3 en 3 op. Deze aanroepen geven een verzameling arrays terug, niet één array met een nieuwe stapelas.
Maak een tabel met metingen
h = np.array([1.62, 1.75, 1.80]) # meters
w = np.array([55.0, 72.5, 80.0]) # kilograms
data = np.column_stack([h, w])
Vorm (3, 2) betekent drie personen met lengte en massa in kolommen. De expressie data[:, 1] / data[:, 0] ** 2 berekent voor elke rij de massa gedeeld door de lengte in het kwadraat en geeft ongeveer 21,0, 23,7 en 24,7 kg/m². Het is essentieel dat de twee meetarrays dezelfde volgorde van personen aanhouden.
Als invoer in batches binnenkomt, verzamel je de batcharrays in een Python-lijst en roep je één keer concatenate aan. Als je tijdens elke lusgang een groeiende array opnieuw samenvoegt, worden de bestaande gegevens telkens opnieuw gekopieerd.
Belangrijkste punten
- Concatenatie breidt een as uit; stapelen voegt er één toe.
- Bij concatenatie moeten de dimensies behalve de samenvoegdimensie overeenkomen.
- Gebruik
column_stackom bij elkaar passende vectoren in tabelkolommen om te zetten. - Splitsposities zijn grenzen; een geheel getal als aantal delen vraagt om gelijke stukken.
array_splitstaat ongelijke lengtes van de delen toe.- Verzamel eerst batches en voeg ze één keer samen.
4Vervang lussen door gevectoriseerde berekeningen, ufuncs en broadcasting
Met expressies voor volledige arrays kun je numeriek werk beschrijven zonder voor elke waarde een Python-lus te schrijven. Begin met berekeningen op overeenkomstige posities, pas daarna wiskundige functies van NumPy toe en combineer verschillende vormen via broadcasting. Aan de vormen kun je aflezen welke waarden worden gekoppeld en welke worden herhaald. Conversieregels, ongeldige invoer en waarschuwingen bij deling zijn ook van belang als een korte expressie veel berekeningen tegelijk uitvoert.
4.1 Reken elementsgewijs in plaats van met lussen
Vectorisatie drukt een berekening uit voor volledige arrays. NumPy voert het herhaalde werk per element uit in gecompileerde code, zodat de Python-expressie dicht bij de bedoelde berekening kan blijven.
Zet een lus om in een berekening op overeenkomstige posities
prices = np.array([2.50, 4.00, 1.20])
qty = np.array([3, 1, 5])
line_totals = prices * qty
order_total = line_totals.sum()
De producten zijn [7.5 4. 6.] en hun som is 17,5. Elke prijs wordt gekoppeld aan het bijbehorende aantal. Een Python-lus die een totaal bijwerkt, levert hetzelfde resultaat op, maar laat Python elk paar afzonderlijk verwerken.
Alle rekenoperatoren werken elementsgewijs: +, -, *, /, //, % en **. Een scalaire waarde wordt op elk item toegepast. 10 - np.array([1, 2, 3]) geeft [9 8 7]; de volgorde van de operanden blijft van belang. Twee arrays hebben gelijke vormen nodig of vormen die compatibel zijn voor broadcasting.
Houd elementsgewijze producten en matrixproducten uit elkaar
* vermenigvuldigt overeenkomstige items. Voor A = np.array([[1, 2], [3, 4]]) en B = np.array([[5, 6], [7, 8]]) geeft A * B de uitvoer [[5 12] [21 32]]. Matrixvermenigvuldiging gebruikt @ en zou [[19 22] [43 50]] geven. Kies * voor gekoppelde metingen zoals prijs en aantal.
Vergelijkingen geven ook één antwoord per positie
a == b levert een booleaanse array op. De expressie vraagt niet of twee arrays als volledige objecten gelijk zijn. Een if-instructie heeft één waarheidswaarde nodig, dus if a == b: mislukt bij resultaten met meerdere elementen. np.array_equal(a, b) toetst of volledige arrays exact gelijk zijn. Voor benaderde decimale getallen toetst np.allclose(a, b) of ze binnen een tolerantie overeenkomen.
Begrijp waarschuwingen bij deling
Met de standaardfoutinstellingen van NumPy levert deling van drijvendekommagetallen door nul een waarschuwing en speciale waarden op:
np.array([1.0, -1.0, 0.0]) / 0
# array([ inf, -inf, nan])
np.isfinite herkent resultaten die noch oneindig noch NaN zijn. Geheeltallige deling door nul met afronding naar beneden geeft daarentegen gehele nullen terug met een waarschuwing. Die nullen lijken eindig, dus controleer gehele noemers met (d == 0).any() voordat je zo deelt. Een waarschuwing verdient aandacht, ook als het programma doorgaat.
Bepaal of je in het bestaande geheugen wilt wijzigen
a += value wijzigt de bestaande opslag en behoudt het datatype. Als a een array met gehele getallen is, geeft a += 0.5 een conversiefout, omdat het drijvendekommaresultaat volgens de conversieregel van die bewerking niet kan worden opgeslagen. a = a + 0.5 maakt een drijvendekommaresultaat en bindt a daaraan. Dit verschilt van het toekennen van één decimaal getal aan een geheel element, waarbij het decimale deel ongemerkt kan worden afgekapt.
Bouw een expressie met meerdere stappen
Voor old = np.array([2.50, 4.00, 8.00]) en new = np.array([3.00, 3.00, 8.00]) geeft (new - old) / old * 100 de uitvoer [20. -25. 0.]. Bepaal eerst elke verandering, deel die door de oorspronkelijke waarde en druk de verhouding vervolgens uit als percentage. De tekens tonen een stijging, een daling en geen verandering. Voor deze percentageberekening mogen de oorspronkelijke waarden niet nul zijn.
Belangrijkste punten
- Gevectoriseerde operatoren rekenen elementsgewijs op volledige arrays.
*koppelt items;@voert een matrixproduct uit.- Voor vergelijkingen van volledige arrays is een functie nodig die één resultaat geeft.
- Controleer noemers en bekijk waarschuwingen bij deling.
- Berekeningen in het bestaande geheugen behouden het datatype van de bestemming.
4.2 Pas universele functies toe op volledige arrays
Een universele functie, of ufunc, past een berekening afzonderlijk toe op elke arraypositie. Deze functies breiden vectorisatie uit van gewoon rekenen naar wortels, logaritmen, afronding, vergelijkingen en andere numerieke bewerkingen.
Kies een functie die met arrays werkt
Unaire ufuncs nemen één invoer. np.sqrt(np.array([1, 4, 9])) geeft [1. 2. 3.] en np.abs(np.array([-2, 3])) geeft [2 3]. np.exp is de exponentiële functie, np.log is de natuurlijke logaritme en np.log10 is de logaritme met grondtal 10. Zo is np.exp(0) gelijk aan 1,0 en np.log10(1000) aan 3,0.
De Python-module math werkt op afzonderlijke getallen. math.sqrt(np.array([1, 4])) kan niet beide wortels berekenen en geeft een typefout. Gebruik voor numerieke arrays de versie van NumPy. Ook operatoren roepen ufuncs aan: a + b komt overeen met np.add(a, b) en a * b met np.multiply(a, b).
Vergelijk overeenkomstige waarden of reduceer een hele array
Binaire ufuncs nemen twee invoerwaarden. np.maximum([1, 5, 3], [4, 2, 6]) geeft [4 5 6] en kiest op elke positie de grootste waarde. np.minimum kiest de kleinste en np.power verheft overeenkomstige grondtallen tot machten.
np.maximum(x, 0) zet negatieve items in een nieuw resultaat op nul. Dit verschilt van np.max(x), een aggregatie die één grootste waarde teruggeeft. Voor [1, 5, 3] geeft max de waarde 5; maximum heeft nog een invoer nodig en behoudt de elementsgewijze structuur.
Rond af volgens de bedoelde regel
| Functie | Regel | Resultaat voor −2,5 |
|---|---|---|
np.floor | Naar beneden, richting min oneindig | −3,0 |
np.ceil | Naar boven, richting plus oneindig | −2,0 |
np.trunc | Richting nul | −2,0 |
np.round | Naar de dichtstbijzijnde waarde; exacte halven naar even | −2,0 |
np.round(x, 2) behoudt twee decimalen. Exacte halven volgen de regel voor even getallen: np.round([0.5, 1.5, 2.5]) geeft [0. 2. 2.]. Binaire benadering kan waarden beïnvloeden die decimaal weergegeven precies halverwege lijken te liggen. Houd daarom bij de interpretatie van weergegeven decimalen rekening met hun drijvendekommaweergave.
Controleer waarden buiten het domein van een functie
Voor reële drijvendekomma-invoer geeft np.sqrt(-1.0) de waarde NaN terug met een waarschuwing, terwijl np.log(0.0) bij de standaardfoutinstellingen min oneindig teruggeeft met een waarschuwing. Anders dan bij math.sqrt(-1) stoppen deze aanroepen normaal gesproken niet met een domeinfout. Controleer de invoer als de wiskundige bewerking een beperkt bereik vereist. np.isnan markeert NaN; np.isfinite markeert waarden die noch NaN noch oneindig zijn; np.isclose vergelijkt waarden met een tolerantie.
Combineer ufuncs tot een bruikbare berekening
Bereken voor coördinatenarrays x = np.array([3, 5, 8]) en y = np.array([4, 12, 15]) de afstand tot de oorsprong met np.sqrt(x ** 2 + y ** 2). Kwadrateren geeft [9 25 64] en [16 144 225]; optellen geeft [25 169 289]; de wortels zijn [5. 13. 17.]. np.hypot(x, y) berekent die afstanden rechtstreeks.
Belangrijkste punten
- Ufuncs voeren op elke positie numerieke bewerkingen uit.
- Gebruik NumPy-functies voor arrays, ook voor wortels en logaritmen.
maximumvergelijkt posities;maxreduceert waarden.- Naar beneden afronden, naar boven afronden, afkappen en afronden volgen verschillende regels.
- Controleer op NaN en oneindig na ongeldige bewerkingen met reële waarden.
4.3 Combineer arrays met verschillende vormen via broadcasting
Broadcasting maakt het mogelijk om arrays met verschillende vormen te gebruiken in elementsgewijze berekeningen. De uitgelijnde assen bepalen welke waarden worden gekoppeld en welke worden herhaald.
Vergelijk dimensies vanaf rechts
Lijn vormen rechts uit. Elk paar aslengtes moet gelijk zijn of één lengte moet gelijk zijn aan 1. Ontbrekende assen aan het begin tellen als lengte 1. Een as met lengte één wordt denkbeeldig uitgebreid om overeen te komen met de andere lengte; NumPy hoeft de herhaalde invoerwaarden niet te kopiëren.
Voor (4, 3) en (3,) komen de laatste lengtes overeen: 3. De ontbrekende eerste dimensie gedraagt zich als 1 en wordt uitgebreid tot 4. Het resultaat is (4, 3): de vector wordt op elke rij toegepast. (4, 3) en (4,) werken niet, omdat de laatste lengtes 3 en 4 verschillen en geen van beide 1 is. Een niet-compatibel paar geeft een ValueError.
Centreer of standaardiseer kolommen
X = np.array([[1, 10], [2, 20], [3, 30]])
centered = X - X.mean(axis=0)
De kolomgemiddelden zijn [2. 20.], met vorm (2,). Ze lijnen uit met de laatste as van (3, 2), wat [[-1. -10.] [0. 0.] [1. 10.]] geeft. Door het gecentreerde resultaat te delen door X.std(axis=0) standaardiseer je elke kolom. Dit levert in beide kolommen ongeveer −1,22, 0 en 1,22 op. Voor deze deling mag de spreiding van geen enkele kolom nul zijn.
Behoud een as voor rijberekeningen
Gebruik een tabel met scores van vier leerlingen en drie toetsen:
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
scores.mean(axis=1) heeft vorm (4,). Die vorm kan niet via broadcasting als één gemiddelde per rij met (4, 3) worden gecombineerd. Behoud de verwijderde as:
row_mean = scores.mean(axis=1, keepdims=True)
centered = scores - row_mean
row_mean heeft nu vorm (4, 1). De eerste 4 komt overeen met de rijen; de laatste 1 wordt uitgebreid over drie kolommen. scores.mean(axis=1)[:, np.newaxis] maakt dezelfde vorm. Als je van de rij [78, 85, 92] het gemiddelde 85 aftrekt, krijg je [-7. 0. 7.].
Gebruik dezelfde regel om een tabel te maken
np.arange(1, 4)[:, np.newaxis] * np.arange(1, 5) combineert (3, 1) en (4,). Beide arrays worden uitgebreid tot de resultaatvorm (3, 4), wat [[1 2 3 4] [2 4 6 8] [3 6 9 12]] oplevert.
Uitbreiding kan ook onbedoeld plaatsvinden. Een kolom met vorm (3, 1) min een vector met vorm (3,) maakt alle negen paarsgewijze verschillen, met vorm (3, 3). Als je drie overeenkomstige verschillen bedoelde, geef je beide invoerarrays vorm (3,), bijvoorbeeld met column.ravel().
Weeg elke kolom vóór het optellen
Voor dezelfde scoretabel en w = np.array([0.2, 0.3, 0.5]) past scores * w de drie gewichten toe op elke rij. Optellen met .sum(axis=1) geeft [87.1 62.8 92.4 74.8]. Het eerste resultaat is 15,6 + 25,5 + 46,0 = 87,1.
Belangrijkste punten
- Lijn vormen vanaf rechts uit; gekoppelde lengtes moeten gelijk zijn of één ervan moet 1 zijn.
- Een as met lengte één bepaalt de richting van de uitbreiding.
- Kolomsamenvattingen lijnen meestal direct uit met een tabel.
- Behoud rijsamenvattingen als kolommen met
keepdims=True. - Broadcasting kan onbedoeld een tabel met paarsgewijze combinaties maken.
- Weeg kolommen voordat je over elke rij reduceert.
5Vat arrays samen met aggregaties langs assen
Een tabel kan een algemeen totaal, één samenvatting per record of één samenvatting per variabele opleveren. Bepaal welke as je wilt samenvoegen en kies vervolgens een statistische maat die je vraag beantwoordt. Posities, cumulatieve totalen en rangordes bieden verschillende manieren om naar de gegevens te kijken. Ontbrekende waarden en voorwaarden vragen om eigen keuzes, omdat filteren of aanvullen zowel kan veranderen welke waarnemingen meetellen als wat het resultaat betekent.
5.1 Aggregeer een volledige array of langs één as
Een aggregatie combineert waarden tot minder resultaten: een totaal, gemiddelde, uiterste of spreidingsmaat. De keuze van de as hoort bij de keuze van de vraag, omdat die bepaalt welke groepen waarden worden gecombineerd.
Voeg de opgegeven as samen
Voor een tabel met vorm (4, 3) met vier leerlingen en drie toetsen gebruikt een aggregatie zonder axis alle 12 waarden. scores.sum() geeft één totaal. scores.mean(axis=0) voegt de leerlingenas samen en laat drie toetsgemiddelden over. scores.mean(axis=1) voegt de toetsas samen en laat vier leerlinggemiddelden over.
scores = np.array([[78, 85, 92], [64, 70, 58],
[88, 91, 95], [72, 68, 80]])
De totale som is 941. De kolomgemiddelden zijn [75.5 78.5 81.25]; de rijgemiddelden zijn ongeveer [85. 64. 91.33 73.33]. Vraag je af welke as moet verdwijnen. Als je zegt “as 0 betekent elke rij”, draai je de bewerking om: as 0 combineert rijen.
Kies welke grootheid je wilt terugkrijgen
| Bewerking | Resultaattype |
|---|---|
sum, prod | Totaal of product |
mean | Rekenkundig gemiddelde |
min, max | Uiterste waarde |
argmin, argmax | Positie van een uiterste |
std, var | Standaardafwijking of variantie |
Methoden zoals a.sum() en functies zoals np.sum(a) drukken dezelfde basisbewerking uit. Met NumPy-methoden vermijd je het andere gedrag van de ingebouwde Python-functies. Zo telt sum(scores) van Python rijarrays op tot kolomtotalen, terwijl scores.sum() alle items combineert. max(scores) van Python probeert rijen te vergelijken en geeft een fout over een dubbelzinnige waarheidswaarde.
Posities verschillen van waarden
scores.mean(axis=1).argmax() is 2: de derde leerling heeft het hoogste gemiddelde. argmax geeft de eerste positie terug als maxima gelijk zijn. Zonder as geeft de functie op een tabel een rijgewijs afgevlakte index terug; scores.argmax() is 8. np.unravel_index(8, scores.shape) haalt de coördinaat (2, 2) terug.
Gebruik keepdims=True als een samenvatting moet uitlijnen met de oorspronkelijke tabel. scores.sum(axis=1, keepdims=True) heeft vorm (4, 1) en is daardoor geschikt voor één normalisatiewaarde per rij. Zonder deze instelling heeft het resultaat vorm (4,).
Behoud tussentotalen als volgorde van belang is
np.cumsum([3, 1, 4, 1, 5]) geeft [3 4 8 9 14]. Elke positie is het totaal tot en met dat punt. np.cumprod([1, 2, 3, 4]) geeft op dezelfde manier [1 2 6 24]. np.diff([3, 1, 4, 1, 5]) geeft de vier veranderingen tussen aangrenzende waarden [-2 3 -3 4]. Geef bij een tabel axis=1 op voor afzonderlijke cumulatieve totalen over de rijen.
Vermeld de afspraak voor spreiding
std en var delen het totaal van de gekwadrateerde afwijkingen standaard door het aantal waarden: ddof=0. Gebruik ddof=1 voor de steekproefformule, waarvan de deler één kleiner is. Voor [2, 4, 4, 4, 5, 5, 7, 9] is het gemiddelde 5, de standaardafwijking met de standaardinstelling 2,0 en de steekproefstandaardafwijking ongeveer 2,14. Een rapport moet duidelijk maken welke afspraak het gebruikt.
Belangrijkste punten
- Het argument
axisgeeft de as aan die wordt samengevoegd. - Zonder as krijg je één samenvatting over de hele array.
argminenargmaxgeven posities terug, waaronder de eerste positie bij gelijke uitersten.keepdims=Truebehoudt gereduceerde assen met lengte 1.- Cumulatieve functies behouden tussenresultaten.
- NumPy gebruikt standaard
ddof=0; metddof=1kies je de deler voor een steekproef. - Gebruik bij arrays bij voorkeur NumPy-aggregaties in plaats van ingebouwde Python-functies.
5.2 Gebruik medianen, percentielen, sortering en unieke waarden
Samenvattingen op basis van volgorde beschrijven waar waarden in een gesorteerde verdeling liggen. Sorteren helpt ook bij het rangschikken van records, maar bij een tabel moet je zorgvuldig te werk gaan om de velden van elk record bij elkaar te houden.
Bepaal het midden en de kwartielen
Voor x = np.array([12, 15, 11, 20, 18, 14]) is de gesorteerde volgorde [11 12 14 15 18 20]. Bij zes waarden neemt np.median(x) het gemiddelde van de middelste twee, 14 en 15, wat 14,5 geeft. Bij een oneven aantal is de mediaan de ene middelste waarde.
np.percentile(x, q) accepteert een percentage van 0 tot 100. np.quantile(x, q) accepteert de overeenkomstige fractie van 0 tot 1. De standaard lineaire interpolatie kan een waarde tussen waarnemingen opleveren. Bij zes waarden is de positie van het 25e percentiel, geteld vanaf nul, 0,25 × 5 = 1,25. Die ligt op een kwart van de afstand van 12 naar 14 en geeft 12,5. Het 50e en 75e percentiel zijn 14,5 en 17,25, dus de interkwartielafstand is 4,75.
De mediaan is beter bestand tegen een extreme waarde dan het gemiddelde. Als je 200 aan deze gegevens toevoegt, verschuift het gemiddelde van 15,0 naar ongeveer 41,4; de mediaan verschuift van 14,5 naar 15,0. Geen van beide maten beschrijft op zichzelf de hele verdeling.
Kies gesorteerde gegevens of sorteerposities
np.sort(x) geeft een gesorteerde kopie terug. x.sort() wijzigt x en geeft None terug, dus y = x.sort() zet geen gesorteerde waarden in y. Gebruik voor aflopende waarden np.sort(x)[::-1].
Bij een 2-dimensionale array vindt sorteren standaard langs de laatste as plaats, waarbij elke rij afzonderlijk wordt gesorteerd. axis=0 sorteert elke kolom afzonderlijk. Geen van beide bewerkingen sorteert records. Voor tab = np.array([[3, 1], [1, 2], [2, 0]]) geeft np.sort(tab, axis=0) de uitvoer [[1 0] [2 1] [3 2]], waardoor waarden die oorspronkelijk bij elkaar hoorden worden gescheiden.
Om records te behouden, haal je een volgorde uit de sleutelkolom en pas je die toe op hele rijen:
order = tab[:, 0].argsort()
ranked = tab[order]
# array([[1, 2], [2, 0], [3, 1]])
Dezelfde indexvolgorde kan bijbehorende vectoren opnieuw ordenen. Als avg = np.array([85.0, 64.0, 91.33, 73.33]) en names = np.array(['Ana', 'Ben', 'Chen', 'Dara']), rangschikt order = np.argsort(avg)[::-1] de gemiddelden in aflopende volgorde. names[order] geeft ['Chen' 'Ana' 'Dara' 'Ben'].
Tel unieke waarden en controleer of waarden voorkomen
np.unique geeft gesorteerde unieke waarden terug. Met return_counts=True geeft de functie ook de bijbehorende aantallen terug:
colors = np.array(['red', 'blue', 'red', 'green', 'blue', 'red'])
values, counts = np.unique(colors, return_counts=True)
De uitvoer is ['blue' 'green' 'red'] en [2 1 3]. values[counts.argmax()] vindt de meest voorkomende waarde, 'red'. De posities van de aantallen komen overeen met die van de unieke waarden.
np.isin(a, allowed) geeft een masker terug dat aangeeft of waarden in een verzameling voorkomen. Voor a = np.arange(1, 6) geeft np.isin(a, [2, 4]) de uitvoer [False True False True False], klaar om die waarden of de bijbehorende records te selecteren.
Belangrijkste punten
- De mediaan gebruikt de gesorteerde positie en is bestand tegen extreme waarden.
- Percentielen gebruiken 0–100; kwantielen gebruiken 0–1.
- De standaardinterpolatie van percentielen kan tussen waarnemingen uitkomen.
np.sortkopieert;.sort()van een array wijzigt de array en geeftNoneterug.- Gebruik posities van
argsortom records en bijbehorende arrays uitgelijnd te houden. unique(..., return_counts=True)koppelt unieke waarden aan frequenties.isinmaakt een masker dat aangeeft of waarden voorkomen.
5.3 Vat gegevens samen met aandacht voor ontbrekende waarden en voorwaarden
Ontbrekende gegevens en gefilterde deelverzamelingen vragen om een expliciete werkwijze voor het samenvatten. Een numeriek resultaat kan onjuist zijn, ook als de arraybewerking succesvol wordt uitgevoerd: een plaatsvervangende waarde kan als meting worden meegeteld of een lege deelverzameling kan voor een betekenisvol gemiddelde worden aangezien.
Zoek ontbrekende waarden vóór het samenvatten
NaN werkt door in gewone sommen en gemiddelden. Voor x = np.array([3.0, np.nan, 5.0]) geven zowel x.sum() als x.mean() de waarde NaN. np.nansum(x) geeft 8,0 en np.nanmean(x) geeft 4,0, waarbij de ontbrekende positie wordt overgeslagen. Verwante functies zijn nanmax, nanmin, nanstd en nanmedian. Als elke waarde ontbreekt, geeft nanmean NaN terug met een waarschuwing, omdat er geen waargenomen waarden overblijven.
Voor sensormetingen in °C:
r = np.array([21.5, np.nan, 22.1, 23.0, np.nan, 21.9])
missing = np.isnan(r)
missing.sum() is 2, missing.mean() is ongeveer 0,33 en r[~missing] behoudt vier metingen. np.nanmean(r) is 22,125 en gebruikt alleen die vier waarden. De vergelijking r == np.nan zou de ontbrekende metingen niet markeren.
Converteer eerst codes voor ontbrekende waarden
Een getal zoals −999 kan in een invoersysteem ontbrekende gegevens aanduiden. NumPy behandelt het als een echte meting totdat je het vervangt:
v = np.array([12, -999, 15, -999, 9]).astype(float)
v[v == -999] = np.nan
np.nanmean(v) # 12.0
Converteer eerst naar float, omdat een array met gehele getallen geen NaN kan opslaan. Deze vervanging is alleen geschikt als −999 voor die gegevens is gedefinieerd als code voor ontbrekende waarden.
Aanvullen verandert de verdeling
Als je ontbrekende temperaturen vervangt door nul, wordt het gemiddelde van het voorbeeld 14,75, hoewel er geen temperatuur van nul is gemeten. Als je ze aanvult met het waargenomen gemiddelde, 22,125, blijft dat gemiddelde behouden maar neemt de schijnbare spreiding af. Een aangevulde waarde is een toegevoegde schatting, dus het effect ervan hoort mee te wegen in de analysekeuze.
Voor een 2-dimensionale tabel D vat np.nanmean(D, axis=0) de waargenomen waarden van elke kolom samen. Elke kolom kan een ander aantal hebben. Om rijen met een ontbrekende waarde te verwijderen:
complete = ~np.isnan(D).any(axis=1)
clean_rows = D[complete]
De reductie maakt één beslissing per rij; de ontkenning behoudt rijen zonder ontbrekende items. Met D = np.array([[1., 2.], [np.nan, 4.], [5., np.nan], [7., 8.]]) behoudt dit [[1. 2.] [7. 8.]].
Vat een voorwaarde of een groep samen
Voor temperaturen t berekent t[t > 20].mean() het gemiddelde van alleen de dagen boven 20 °C. Gebruik bij gegroepeerde gegevens een passend labelmasker: met group = np.array(['A', 'B', 'A', 'B', 'A']) en value = np.array([10, 20, 14, 26, 12]) is value[group == 'A'].mean() gelijk aan 12,0 en het overeenkomstige gemiddelde voor B aan 23,0. Doorloop np.unique(group) om dit voor elke groep te herhalen.
Controleer mask.any() voordat je een gefilterde deelverzameling samenvat. Het gemiddelde van een lege selectie is NaN met een waarschuwing, terwijl de som 0 is. Die nul kan een geldig leeg totaal zijn, maar bewijst niet dat er een meting aanwezig was.
Belangrijkste punten
- Gewone sommen en gemiddelden geven NaN door; varianten die rekening houden met NaN slaan die over.
- Converteer gedefinieerde codes voor ontbrekende waarden naar NaN in drijvendekommaopslag.
- Het aanvullen van ontbrekende waarden verandert de statistische maten.
- Rijgewijze controles op ontbrekende waarden kunnen volledige records aanwijzen.
- Combineer label- of voorwaardemaskers met aggregaties.
- Controleer op een lege deelverzameling voordat je het gemiddelde interpreteert.
6Genereer toevalsgetallen en voer simulaties uit
Willekeurige arrays ondersteunen herhaalbare steekproeven en praktische experimenten. Maak één Generator met een startwaarde, kies een verdeling en uitvoervorm en behoud de relaties tussen records wanneer je gegevens schudt of splitst. Maak in een simulatie de structuur van de proeven expliciet voordat je gebeurtenissen of posities na opeenvolgende stappen berekent. Vergelijk resultaten met eenvoudige exacte gevallen en onderscheid gewone steekproefvariatie van fouten in de code.
6.1 Trek reproduceerbare aselecte steekproeven met een Generator
Een toevalsgenerator ondersteunt steekproeven, schudden en simulatie. Een startwaarde maakt de begintoestand herhaalbaar, zodat je een analyse opnieuw kunt uitvoeren terwijl je de werking onderzoekt.
Maak één Generator en gebruik die opnieuw
rng = np.random.default_rng(42)
NumPy beveelt deze Generator-interface aan voor nieuwe code. De standaard bitgenerator is PCG64. Zonder startwaarde haalt default_rng() nieuwe entropie uit het besturingssysteem. Oudere aanroepen zoals np.random.seed en np.random.rand gebruiken een gedeelde globale toestand; met Generator-objecten kan een analyse de eigen toestand rechtstreeks beheren.
Pseudowillekeurige waarden komen uit een deterministisch algoritme. Dezelfde begintoestand en dezelfde reeks aanroepen reproduceren de getallenreeks in dezelfde omgeving. Elke trekking verandert de toestand. Als je tijdens elke lusgang een nieuwe Generator met startwaarde 42 maakt, begint de reeks opnieuw en worden dezelfde eerste trekkingen herhaald in plaats van de reeks voort te zetten. Leg naast de startwaarde ook de NumPy-versie en de code vast, omdat compatibiliteit van de reeks tussen versies of in alle omgevingen niet is gegarandeerd. Gebruik voor wachtwoorden of beveiligingstokens de Python-module secrets.
Kies een verdeling en een uitvoervorm
| Aanroep | Betekenis |
|---|---|
rng.random(5) | Vijf decimale getallen vanaf 0 inclusief tot 1 exclusief |
rng.uniform(2, 8, size=5) | Vijf trekkingen uit een uniforme verdeling over het interval van 2 tot 8 |
rng.integers(1, 7, size=10) | Tien gehele getallen van 1 tot en met 6 |
rng.normal(loc=170, scale=10, size=(3, 4)) | Een 3×4-steekproef uit een normale verdeling |
size kan een aantal elementen of een tuple met de vorm zijn. Voor normal is loc het gemiddelde van de verdeling en scale de standaardafwijking ervan. Een variantie van 100 vereist daarom scale=10. Het werkelijke gemiddelde en de werkelijke standaardafwijking van een kleine steekproef hoeven niet exact overeen te komen met de parameters van de verdeling.
Bij trekkingen van gehele getallen is de bovengrens standaard uitgesloten. Voor een dobbelsteen is integers(1, 7) nodig, omdat integers(1, 6) geen 6 kan trekken. integers(1, 6, endpoint=True) neemt de bovengrens mee en modelleert ook een dobbelsteen.
Trek waarden met of zonder teruglegging
rng.choice(['heads', 'tails'], size=5) doet vijf trekkingen met teruglegging. Een waarde kan meerdere keren voorkomen. Gebruik replace=False om verschillende posities te trekken; als je meer posities vraagt dan de populatie heeft, krijg je een ValueError. Kansen kun je opgeven als p=[0.7, 0.3], in dezelfde volgorde als de waarden. Ze moeten samen 1 zijn.
Zonder teruglegging voorkomt dat een invoerpositie twee keer wordt geselecteerd. Als de invoer zelf dubbele waarden bevat, kunnen gelijke waarden nog steeds in de steekproef voorkomen.
Schud records zonder hun velden te scheiden
rng.shuffle(a) herschikt de bestaande array en geeft None terug. rng.permutation(a) geeft een geschudde kopie terug. rng.permutation(10) geeft gehele getallen van 0 tot en met 9 in willekeurige volgorde, bruikbaar als rijindexen.
Bij een 2-dimensionale array is de standaardas 0: volledige rijen bewegen samen. Daardoor blijven de velden van elke waarneming uitgelijnd. Om twee bijbehorende arrays op dezelfde manier te schudden, maak je één permutatie van hun gedeelde recordindexen en pas je die op beide toe.
Belangrijkste punten
- Maak één Generator met een startwaarde en gebruik de veranderende toestand opnieuw.
- Reproduceerbaarheid hangt af van de startwaarde, aanroepen en numerieke omgeving.
- Trekkingen van gehele getallen sluiten de bovengrens uit, tenzij je
endpoint=Truegebruikt. scalebij een normale verdeling is de standaardafwijking, niet de variantie.choicetrekt standaard steekproeven met teruglegging.shufflewijzigt de array;permutationgeeft een geschud resultaat terug.
6.2 Voer gevectoriseerde simulaties uit
Een gevectoriseerde simulatie geeft herhaalde proeven weer als arrays, past de regel voor de gebeurtenis op die arrays toe en vat de resultaten samen. De vorm van de array moet laten zien wat één proef bevat.
Zet een gebeurtenis om in een aandeel
rng = np.random.default_rng(42)
rolls = rng.integers(1, 7, size=100_000)
estimate = (rolls == 6).mean()
Het masker is één keer waar voor elke waargenomen 6. Het gemiddelde ervan schat de kans op die gebeurtenis, dicht bij 1/6, of ongeveer 0,1667. rolls.mean() beantwoordt een andere vraag: de gemiddelde waarde op de dobbelsteen, dicht bij 3,5. Een vaste startwaarde herhaalt een schatting; die maakt de schatting niet exact.
Vectorisatie voorkomt werk op Python-niveau voor elke trekking, waardoor grote simulaties vaak veel sneller zijn dan een lus. De snelheidswinst hangt af van de berekening, de grootte van de array en de computer en is dus geen vaste eigenschap van de gebeurtenis.
Gebruik één rij per proef met meerdere waarden
Om in elke proef twee dobbelstenen te simuleren:
dice = rng.integers(1, 7, size=(100_000, 2))
totals = dice.sum(axis=1)
p_seven = (totals == 7).mean()
De tabel heeft 100.000 proefrijen en twee dobbelsteenkolommen. Reductie van as 1 levert één totaal per proef op. Zes van de 36 even waarschijnlijke geordende paren hebben samen 7, dus de geschatte kans zou dicht bij 6/36 moeten liggen. Reductie van as 0 zou daarentegen twee totalen over alle proeven geven en de gebeurtenis per proef verloren laten gaan.
Grotere simulaties variëren nog steeds
Voor onafhankelijke proeven is de standaardfout van een geschat aandeel:
Hier is de kans op de gebeurtenis en het aantal proeven. Voor een 6 met een dobbelsteen bij 100.000 proeven is die ongeveer 0,0012. Volgens een normale benadering ligt ongeveer 95% van de schattingen binnen 0,0023 van 1/6. Als het aantal proeven met een factor 100 toeneemt, neemt de standaardfout af met een factor 10. Meer trekkingen corrigeren een onjuist gecodeerde gebeurtenis niet.
Maak en inspecteer een toevalswandeling
steps = rng.choice([-1, 1], size=1000) trekt stappen naar links of rechts. walk = steps.cumsum() geeft de positie na elke stap. Het maximum en minimum geven de uiterste bezochte posities aan. Om het eerste punt op minstens 10 eenheden van het begin te vinden:
hit = np.abs(walk) >= 10
if hit.any():
step_count = hit.argmax() + 1
argmax vindt het eerste item dat waar is, maar geeft ook 0 terug als elk item onwaar is. De controle met any() maakt onderscheid tussen een werkelijk bereikt punt en geen bereikt punt. Tel 1 op omdat arraypositie 0 de positie na stap 1 is.
Voor veel wandelingen telt rng.choice([-1, 1], size=(5000, 1000)).cumsum(axis=1) afzonderlijk op langs elke rij. walks[:, -1] selecteert alle eindposities; hun gemiddelde ligt dicht bij 0 en hun standaardafwijking dicht bij de vierkantswortel van 1.000, ongeveer 31,6.
Gebruik permutaties en exacte controles
Een willekeurige splitsing van 100 records kan idx = rng.permutation(100) gebruiken, gevolgd door data[idx[:80]] en data[idx[80:]]. De twee niet-overlappende deelbereiken van één permutatie wijzen elk record precies één keer toe. Vergelijk bij een simulatie een eenvoudig geval met een exact antwoord, zoals een dobbelsteengemiddelde van 3,5, voordat je op ingewikkeldere uitvoer vertrouwt.
Belangrijkste punten
- Geef één proef duidelijk weer in de vorm van de array.
- Een gemiddelde van booleaanse waarden schat de kans op een gebeurtenis.
- Reduceer binnen proeven voordat je resultaten over proeven combineert.
- De standaardfout neemt af volgens de vierkantswortel van het aantal proeven.
- Controleer of een punt is bereikt voordat je
argmaxgebruikt om het eerste bereikte punt te vinden. - Eén permutatie kan niet-overlappende willekeurige splitsingen van records opleveren.
- Controleer de werking van een simulatie aan de hand van een eenvoudig exact geval.
NumPy-arrays: voorbeelden
1Maak een meetarray waarop je kunt vertrouwen
14 stappen
- 1IntroductiePlan de records en metingen
Een meettabel vereist vóór elke berekening twee keuzes: wat elke as voorstelt en welk soort waarden moet worden opgeslagen. We maken een kleine tabel, inspecteren de vorm en kiezen aanmaak- en conversiemethoden die de gegevens behouden.
Zet
import numpy as npbovenaan het script. De naamnpgeeft toegang tot de NumPy-functies die in de voorbeelden worden gebruikt. - 2UitlegLees een tabel aan de hand van de assen
Maak
a = np.array([[2, 4, 6], [3, 5, 7]]). De buitenste reeks levert twee rijen; elke binnenste reeks levert drie waarden.a.shapeis(2, 3),a.ndimis 2 ena.sizeis 6. De vorm beschrijft de rangschikking, ndim telt assen en size telt alle items. Als elke rij één record is, bevat deze tabel twee records met elk drie metingen. - 3KernpuntGelijke aantallen elementen kunnen verschillende structuren hebben
Een vector met lengte zes heeft vorm
(6,). Een tabel met één rij heeft vorm(1, 6)en een tabel met één kolom heeft vorm(6, 1). Elk bevat zes waarden, maar alleen de laatste twee hebben afzonderlijke rij- en kolomassen.De komma aan het eind van
(6,)duidt een tuple met één item aan. Dit is nuttige informatie: de vector heeft één as en dus geen afzonderlijke rijrichting die kan worden getransponeerd tot een kolom. - 4UitdagingVoorspel de vermenigvuldiging voordat je die uitvoert
Wat zijn de resultaten van
[2, 5] * 2ennp.array([2, 5]) * 2?---reveal---
De lijst wordt
[2, 5, 2, 5]. De array wordt[4 10]. Bij vermenigvuldiging met een geheel getal herhalen lijsten hun inhoud; numerieke arrays vermenigvuldigen de waarden op elke positie. De array behoudt de vorm, waardoor die geschikt is om een berekening op elke vastgelegde waarde toe te passen. - 5VoorbeeldReserveer een tabel met een bekende vorm
Stel dat twee stations elk vier neerslagmetingen in millimeters leveren. Maak
rain = np.zeros((2, 4))en ken vervolgensrain[0] = [4.0, 0.0, 3.5, 6.0]toe.De tuple
(2, 4)is één vormargument. Zeros gebruikt standaard drijvendekommaopslag, zodat de meting 3,5 behouden blijft. Door de uiteindelijke vorm één keer te reserveren voorkom je dat een groeiende array telkens wordt gekopieerd wanneer metingen binnenkomen. - 6TipKies de beginvulling bewust
Gebruik
zerosals nullen als beginwaarde betekenisvol zijn,onesvoor enen enfull(shape, value)voor een andere herhaalde waarde. Hun namen beschrijven de begininhoud.emptyreserveert alleen opslag. De beginwaarden zijn niet klaar voor gebruik, dus elk item moet worden gevuld voordat het wordt gelezen. Een met nullen gevulde tabel is makkelijker te inspecteren wanneer je code schrijft die slechts enkele items een waarde geeft. - 7UitlegTel punten en tussenruimtes afzonderlijk
Voor meetposities van 0 m tot en met 2 m met tussenruimtes van 0,5 m zijn er vijf punten en vier tussenruimtes.
np.linspace(0, 2, 5)maakt die punten en neemt beide uiteinden mee.np.arange(0, 2, 0.5)gebruikt een stap en sluit de stopwaarde uit, dus laat 2 m weg. Afronding van drijvendekommagetallen kan decimalearange-rasters ook verrassend maken; gebruiklinspaceals het aantal punten de eis is. - 8UitdagingKies een raster op basis van de eindpunten
Een scan vereist negen gelijkmatig verdeelde posities van 0 cm tot 4 cm, inclusief beide uiteinden. Welke aanmaakaanroep past hierbij en wat is de tussenafstand?
---reveal---
Gebruik
np.linspace(0, 4, 9). Negen punten maken acht tussenruimtes over 4 cm, dus de tussenafstand is 0,5 cm. Een derde argument van 8 zou om acht punten vragen, waardoor slechts zeven tussenruimtes overblijven en een andere afstand tussen metingen ontstaat. - 9UitlegInspecteer het afgeleide datatype
np.array([1, 2.5])wordt een array met drijvendekommagetallen omdat één gedeeld datatype beide waarden moet kunnen bevatten. Als je een getal met tekst mengt, kunnen daarentegen alle waarden in tekst veranderen, waardoor berekeningen mislukken.Inspecteer
a.dtypeals de waarden zich niet gedragen zoals verwacht.a.itemsizegeeft het aantal opslagbytes per element; als je dat vermenigvuldigt meta.size, krijg jea.nbytes, het totale aantal bytes dat de elementen innemen. - 10VoorbeeldZie hoe een toekenning decimalen laat vervallen
Begin met
counts = np.array([2, 4, 6])en voer daarnacounts[0] = 3.8uit. Het eerste item wordt 3 omdat de bestaande opslag voor gehele getallen blijft.Om latere decimalen te behouden, maak je eerst drijvendekommaopslag met
values = counts.astype(float).astypemaakt een geconverteerde kopie. De functie verandert het datatype van de oorspronkelijke array niet en herstelt geen informatie achter de komma die een eerdere toekenning al heeft weggegooid. - 11KernpuntConversie en afronding zijn afzonderlijke stappen
np.array([2.8, -2.8]).astype(int)geeft[2 -2]: afkappen gaat richting nul.np.roundrondt af naar de dichtstbijzijnde waarde, waarbij exacte halven naar even gaan, dus 2,5 wordt afgerond naar 2,0.Kleine geheelgetaltypes brengen een ander risico mee. Een
uint8kan 260 niet bevatten, dus bij arrayberekeningen zoals 250 plus 10 kan de waarde teruglopen naar 4. Zet het datatype om naar een ruimer type voordat je waarden berekent die buiten het bereik kunnen komen. - 12UitdagingBehoud een ontbrekende meting
Je hebt
a = np.array([5, 7, 9])en moet de middelste meting als ontbrekend markeren. Welke voorbereiding heeft de array nodig voordat je NaN toekent?---reveal---
Converteer naar drijvendekommaopslag:
a = a.astype(float)en stel daarnaa[1] = np.nanin. Opslag voor gehele getallen kan NaN niet weergeven. Het resultaat is[5. nan 9.]; als je nul zou gebruiken, leg je een numerieke waarde vast in plaats van een ontbrekende meting te markeren. - 13UitdagingCombineer aanmaken met een latere wijziging
Je maakt
template = np.array([1, 2])en hebt vervolgens een array met dezelfde vorm nodig waarvan de waarden later 1,5 en NaN kunnen bevatten. Welke keuze bij het aanmaken houdt die waarden mogelijk?---reveal---
Gebruik een drijvendekommatype, bijvoorbeeld
np.zeros_like(template, dtype=float). De like-functie zou standaard de opslag voor gehele getallen overnemen. De vorm kan(2,)blijven, terwijl float zowel de meting met decimalen als de markering voor ontbrekende waarden mogelijk maakt. - 14SamenvattingInspecteer de structuur voordat je rekent
Inspecteer bij de volgende array die je maakt
shape,sizeendtypevoordat je berekeningen uitvoert. Controleer of elke as de bedoelde groep waarden voorstelt en of de opslag de metingen kan bevatten die je gaat toekennen.Kies bewust een aantal punten of een stap wanneer je een raster maakt. Als decimale waarden of NaN zullen voorkomen, plan dan drijvendekommaopslag voordat je die waarden in de array schrijft.
2Selecteer records en bepaal wat wijzigingen veranderen
16 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVraag welke waarden in het resultaat horen
- 2UitlegVolg start, stop en stap
- 3VoorbeeldSelecteer rijen en kolommen in één expressie
- 4UitdagingBehoud een kolomas
- 5VoorbeeldVolg een schrijfbewerking via een weergave
- 6TipMaak onafhankelijkheid expliciet
- 7UitlegKoppel coördinaten of kies een blok
- 8UitdagingOnderscheid een kopie van een directe toekenning
- 9UitlegZet een voorwaarde om in een selectie
- 10VoorbeeldCombineer intervalgrenzen
- 11KernpuntTel gebeurtenissen of bereken het gemiddelde van hun waarden
- 12VoorbeeldKies voor vervangen of filteren
- 13UitdagingBehoud volledige rijen
- 14TipZoek NaN zonder gelijkheid
- 15UitdagingWijzig geselecteerde records onafhankelijk
- 16SamenvattingControleer het doel van elke wijziging
3Geef waarden de juiste vorm en groepering
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieMaak groepering zichtbaar in de vorm
- 2VoorbeeldGroepeer opeenvolgende waarden in perioden
- 3UitlegLeid één ontbrekende dimensie af
- 4VoorbeeldVerwissel de betekenis van rijen en kolommen
- 5UitdagingMaak een kolom van een vector
- 6TipKies een manier van afvlakken met het oog op wijzigen
- 7UitlegBreid een bestaande as uit
- 8VoorbeeldVoeg in plaats daarvan een batchas toe
- 9UitdagingMaak twee meetkolommen
- 10VoorbeeldSplits op grenzen of op aantal delen
- 11UitdagingBouw een tabel opnieuw op uit rijbatches
- 12SamenvattingLees vormen als keuzes over gegevens
4Reken over records zonder Python-lus
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLaat de expressie de berekening beschrijven
- 2VoorbeeldVermenigvuldig gepaarde waarden en tel ze op
- 3UitlegGebruik de juiste productoperator
- 4TipControleer de bestemming en de noemer
- 5UitdagingKies de referentie voor procentuele verandering
- 6UitlegPas wiskundige functies toe op arrays
- 7VoorbeeldBereken afstanden in stappen
- 8UitdagingVergelijk maximum met een reductie
- 9TipInspecteer afronding en ongeldige waarden
- 10UitlegLijn vormen vanaf rechts uit
- 11VoorbeeldBehoud rijgemiddelden als kolom
- 12KernpuntEen geldige broadcastingbewerking kan de verkeerde vraag beantwoorden
- 13UitdagingVoorspel een resultaat van broadcasting
- 14UitdagingWeeg gecentreerde metingen
- 15SamenvattingControleer waarden, koppeling en uitvoervorm
5Vat de waarnemingen samen die je vraag beantwoorden
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKies eerst de vraag en dan de statistische maat
- 2VoorbeeldReduceer de meetas
- 3KernpuntVolg wat de reductie overhoudt
- 4VoorbeeldOnderscheid positie, waarde en cumulatief totaal
- 5UitdagingKies de deler voor de variantie
- 6VoorbeeldBepaal een mediaan en een percentiel
- 7TipSorteer records via posities
- 8UitdagingHaal een label terug uit het aantal
- 9UitlegSla ontbrekende waarden bewust over
- 10VoorbeeldZet een code voor ontbrekende waarden om vóór het middelen
- 11KernpuntAanvullen maakt waarnemingen voor de berekening
- 12VoorbeeldMaak één beslissing over volledigheid per rij
- 13UitdagingHerken een lege deelverzameling
- 14UitdagingVat groepen samen en vergelijk ze
- 15SamenvattingRapporteer wat aan elke samenvatting heeft bijgedragen
6Voer een reproduceerbare simulatie uit, van trekkingen tot resultaten
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGeef elke gesimuleerde proef een duidelijke vorm
- 2UitlegMaak de Generator één keer
- 3VoorbeeldStel parameters in voor gehele en normaal verdeelde trekkingen
- 4UitdagingZoek de fout met herhaalde toevalswaarden
- 5TipKies teruglegging en behoud records
- 6VoorbeeldSchat een gebeurtenis met een masker
- 7VoorbeeldReduceer binnen elke proef met twee dobbelstenen
- 8UitdagingVerander de gebeurtenis naar minstens één dobbelsteen
- 9UitlegVerwacht steekproefvariatie
- 10VoorbeeldTel stappen cumulatief op tot een pad
- 11TipControleer of de grens is bereikt
- 12UitdagingVerdeel records precies één keer
- 13UitdagingBepaal wat een veel grotere uitvoering kan herstellen
- 14SamenvattingControleer eerst het model en daarna de precisie
NumPy-arrays: oefenvragen
Set 1: Lees arrays en kies de juiste bewerking10 Oefenvragen
Vraag 1 van 10
Toon antwoordVerberg antwoord
(8, 5). (5, 8) draait de rollen van records en metingen om. Er zijn in totaal 40 elementen, maar dat aantal vervangt de vorm met twee assen niet.Vraag 2 van 10
Toon antwoordVerberg antwoord
np.linspace(0, 3, 7) geeft een tussenafstand van 0,5 m en neemt beide uiteinden mee. np.arange(0, 3, 0.5) stopt vóór 3 en geeft slechts zes punten. Bij linspace telt het derde argument punten, geen tussenruimtes.Vraag 3 van 10
np.array([4.9, -4.9]).astype(int) op?Toon antwoordVerberg antwoord
astype(int) wordt het deel achter de komma richting nul verwijderd, wat 4 en −4 geeft. Voor het resultaat [5, -5] zou je eerst naar de dichtstbijzijnde waarde moeten afronden. Geheeltallige deling met afronding naar beneden gebruikt voor negatieve waarden een andere richting en beschrijft deze conversie niet.Vraag 4 van 10
(v >= 8).mean() terug voor v = np.array([2, 8, 11, 5, 14])?Toon antwoordVerberg antwoord
Vraag 5 van 10
[batch_id, mass_kg]: d = np.array([[1, 4], [2, 9], [1, 7], [2, 5]]). Wat is de gemiddelde massa van de records van batch 1 waarvan de massa groter is dan 5 kg?Toon antwoordVerberg antwoord
[1, 7] blijft over, dus de gemiddelde massa is 7,0 kg. Een gemiddelde van 5,5 kg bevat beide records van batch 1 en mist de voorwaarde voor de massa; 8,0 kg negeert de voorwaarde voor de batch.Vraag 6 van 10
np.arange(8).reshape(2, 4).T[1]?Toon antwoordVerberg antwoord
[0, 1, 2, 3] en [4, 5, 6, 7]. Transponeren maakt van hun tweede kolom rij 1, [1, 5]. Als je [2, 3] krijgt, groepeer je de oorspronkelijke reeks opnieuw in rijen met lengte twee; dat is een vormwijziging en geen verwisseling van assen.Vraag 7 van 10
np.array([5., 8.]) en nieuwe prijzen zijn np.array([6., 6.]). Welke procentuele veranderingen geeft (new - old) / old * 100?Toon antwoordVerberg antwoord
Vraag 8 van 10
Toon antwoordVerberg antwoord
cumsum(axis=1) behoudt een cumulatief totaal op elke dag in plaats van slechts één totaal per machine terug te geven.Vraag 9 van 10
d = np.array([[9, 30], [2, 80], [5, 40]]). Hoe sorteer je records op hun eerste kolom, van klein naar groot, terwijl je elke rij bij elkaar houdt?Toon antwoordVerberg antwoord
argsort() geeft rijposities in de volgorde 1, 2, 0. Als je die posities op d toepast, verplaats je volledige records. Kolommen afzonderlijk sorteren met np.sort(d, axis=0) zou de waarden in de eerste kolom scheiden van de waarden in de tweede kolom die oorspronkelijk erbij waren vastgelegd.Vraag 10 van 10
Toon antwoordVerberg antwoord
Set 2: Verbind selecties, vormen en samenvattingen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
np.arange(4, 16, 5)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
np.full_like(template, 1.8) na template = np.array([2, 4, 6]) met het standaarddatatype?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
a na a = np.arange(7); b = a[1:5]; c = a[[1, 4]]; b[1] = 90; c[0] = 80?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
a[1:6:2] voor a = np.array([3, 6, 9, 12, 15, 18, 21])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
a en b hebben vormen (3, 2) en (3, 5). Welke vorm heeft np.concatenate([a, b], axis=1)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
np.floor(x) - np.trunc(x) voor x = np.array([-3.5, 2.5])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
x = np.array([6., 8.]) en y = np.array([8., 15.]) in meters alleen punten op maximaal 12 m van de oorsprong. Welke afstanden blijven over?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
x = np.array([10., np.nan, 16., np.nan, 22.]) het gemiddelde nadat elke NaN door nul is vervangen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
rng.choice(np.arange(5), size=6, replace=False) wordt aangeroepen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
dice bevat 60.000 proeven met drie eerlijke dobbelstenen en heeft vorm (60000, 3). Welke expressie schat de kans dat een proef minstens één 6 bevat?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Volg gegevens door meerdere arraybewerkingen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
a = np.array([8, 12]); a[0] = 3.7; b = a / 2?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
m = np.arange(20).reshape(4, 5) de vorm en waarden van m[1:3, 2:3]?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
t[1, :, 2:4] voor een array t met vorm (3, 4, 5)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
v = np.arange(1, 13) worden gegroepeerd in vier opeenvolgende perioden van drie uur. Wat is de eerste rij nadat de assen voor de periode en de positie binnen de periode zijn verwisseld?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
np.array_split(np.arange(14), 4) op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
A * A terug voor A = np.array([[2, 3], [4, 5]])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
X zijn [2., 6.] en [8., 12.]. Van elke rij moet het eigen gemiddelde worden afgetrokken. Welk resultaat geeft de onjuiste expressie X - X.mean(axis=1) daadwerkelijk?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
x.var(ddof=1) voor x = np.array([1., 3., 5.])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
np.percentile([4, 8, 12, 20], 25) met de standaardinterpolatie van NumPy?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
steps bevat vijf stappen van ±1 voor één wandeling. Je hebt het aandeel wandelingen nodig dat op een vastgelegde stap minstens 3 eenheden van het begin bereikt. Welke expressie berekent dat aandeel?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Onderzoek resultaten die aannemelijk lijken10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
a heeft vorm (6, 4) en itemsize == 8. Je voert b = a[::2, 1:] uit en daarna c = b[:, ::2].copy(). Hoeveel bytes elementopslag heeft c?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
np.array([4, 7]) * 3 op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
m[[0, 2], [1, 3]] voor m = np.arange(12).reshape(3, 4)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
[group, reading] in d zijn [[1., 6.], [2., np.nan], [1., 10.], [2., 14.], [1., np.nan]]. Hoe krijg je het gemiddelde van de aanwezige metingen in groep 1?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
v.T.shape en v[:, np.newaxis].shape zich na v = np.arange(5)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
np.maximum(x, 3) op voor x = np.array([-4., 2., 7.])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
(3, 2) bevat gepaarde waarden voor drie records. Een vector offset met lengte drie geeft één correctie per record. Je moet elke correctie optellen bij beide waarden in het eigen record. Welke expressie en resultaatvorm passen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
values, counts = np.unique([4, 9, 4, 2, 9, 9], return_counts=True). Wat geeft values[counts.argmax()] terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
np.nanmean(D, axis=0) terug voor D = np.array([[2., 4.], [np.nan, 6.], [8., np.nan]])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
ids = np.arange(6) en een afzonderlijke meetarray hebben dezelfde recordvolgorde. Je hebt vier trainingsrecords en twee testrecords nodig, met bijpassende identificatiecodes en metingen en zonder overlap. Welke aanpak garandeert dit?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 5: Combineer arrayhulpmiddelen in volledige analyses10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
np.array([5, -999, 9]), waarbij −999 ontbrekend betekent. Je hebt het waargenomen gemiddelde nodig nadat je bij elke aanwezige meting een correctie van 0,5 hebt opgeteld. Wat is het juiste resultaat?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
a = np.array([2, 5, 8, 11]); b = a[1:]; c = b[[0, 2]]; b[0] = 20; c[1] = 30; a[[0, 3]] = c. Wat is a daarna?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
x = np.array([1., np.nan, 4., 7.]) wil je het aandeel waargenomen waarden dat groter is dan 3. Wat is dat aandeel?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
(2, 3). Welke vorm ontstaat door np.stack([a, b], axis=1)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
a = np.array([3, 6]) heb je de waarden [3.5, 6.5] nodig. Waarom werkt a = a + 0.5, terwijl a += 0.5 een fout geeft?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
X = np.array([[2., 6., 10.], [4., 8., 12.]]) wordt afzonderlijk binnen elke rij gecentreerd. Welk resultaat moet de juiste expressie opleveren?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
X = np.array([[3., 9.], [5., 7.], [8., 4.]]) bevat twee metingen. Centreer elke rij, weeg daarna de eerste kolom met 0,25 en de tweede met 0,75 en tel binnen elke rij op. Wat zijn de resultaten?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
x.argmax() voor x = np.array([7, 12, 12, 4])?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
[group, reading] in D zijn [[1., 4.], [1., np.nan], [2., 8.], [2., 10.], [2., np.nan]]. Vul elke ontbrekende meting aan met het waargenomen gemiddelde van de eigen groep. Wat is het gemiddelde van alle vijf aangevulde metingen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
aantal elementen
(4, 7) heeft 28 elementen, hoewel het attribuut ndim slechts twee assen aangeeft.afkappen
astype(int) geeft −7; toepassing van floor zou −8 geven.afvlakken
flatten kopieert de gegevens, terwijl ravel de oorspronkelijke gegevens kan delen.table.flatten() aan als je een afzonderlijk 1-dimensionaal resultaat nodig hebt waarvan wijzigingen de tabel niet kunnen veranderen.aggregatie
table.mean(axis=0) aanroepen combineert records tot één gemiddelde voor elke meetkolom.aggregatie met overslaan van NaN-waarden
nanmean of nanmedian.np.nanmean([5., np.nan, 9.]) geeft 7,0 terug door het gemiddelde van de twee waargenomen waarden te berekenen.aliasing
b = a is de expressie b is a waar en verandert een toekenning via een van beide namen die ene array.as
data[:, 0] alle posities op de rijas en selecteert de eerste kolom.as met lengte één
[:, None] toevoegt aan een vector met lengte vier, ontstaat vorm (4, 1), geschikt voor één waarde per tabelrij.B
begrenzen
np.clip(readings, 10, 30) behoudt waarden binnen het bereik en vervangt metingen daarbuiten door 10 of 30.bewerking in het bestaande geheugen
+= bij een array met gehele getallen mislukt, terwijl een gewone optelling drijvendekommaopslag kan maken.binaire ufunc
np.maximum(observed, minimum) kiest op elke uitvoerpositie de grootste van twee uitgelijnde waarden.booleaans masker
t > 25 de dagen waarop de vastgelegde temperatuur hoger is dan 25 °C.booleaanse indexering
data[data[:, 0] > 10] behoudt hele rijen op basis van de voorwaarde die op hun eerste kolom wordt toegepast.broadcasting
(3,) optellen bij een tabel met vorm (8, 3) past die vector toe op elk van de acht rijen.C
centreren
X - X.mean(axis=0) trekt het gemiddelde van elke kolom af van de waarden in diezelfde kolom.code voor ontbrekende waarden
compatibele dimensies
(5, 1) en (4,) combineren tot (5, 4) omdat hun uitgelijnde assen aan de compatibiliteitsregel voldoen.concatenatie
(2, 4) en (5, 4) langs as 0 samenvoegen maakt een tabel met zeven rijen en vier kolommen.cumulatieve som
np.cumsum([2, 5, 1]) geeft [2, 7, 8], nuttig om een saldo te volgen terwijl items worden opgeteld.D
datatype
data.dtype inspecteert, kan blijken dat een verdwaald tekstlabel ervoor zorgde dat numeriek ogende waarden als tekenreeksen zijn opgeslagen.deelbereik
a[2:7:2] selecteert posities 2, 4 en 6 en slaat één positie tussen geselecteerde waarden over.domein van een functie
np.sqrt(-4.0) geeft normaal gesproken een waarschuwing en NaN terug.drijvendekommagetal
np.allclose als kleine weergaveverschillen zijn toegestaan.E
eenheidsmatrix
np.eye.np.eye(4) maakt vier enen op de diagonaal van een 4×4-array, met nullen op de overige posities.eerste bereiktijd
elementsgewijs rekenen
(2, 3) vermenigvuldigen met * geeft zes gepaarde producten in een andere array met vorm (2, 3).elementsgewijze logische bewerking
&, | of ~ voor en, of respectievelijk ontkenning.(x >= 2) & (x <= 8) behoudt waarden die aan beide grenzen voldoen, met elke vergelijking tussen haakjes.F
functie voor het aanmaken van arrays
np.full((3, 2), 8) maakt drie rijen van twee waarden zonder dat je zes afzonderlijke invoerwaarden hoeft te schrijven.G
gedeeld geheugengebruik
np.shares_memory toetst of twee specifieke arrays overlappen.gelijkmatige puntafstand
linspace maakt dit raster op basis van de eindpunten en het aantal punten.gemiddelde-imputatie
Generator
default_rng en hergebruikt via methoden die de interne toestand veranderen.rng.integers twee keer aanroepen zet de reeks voort; rng opnieuw maken met dezelfde startwaarde begint de reeks opnieuw.gepaarde coördinaten
m[[0, 2], [1, 3]] selecteert coördinaten (0, 1) en (2, 3), geen 2×2-blok.gewogen som
(scores * weights).sum(axis=1) maakt een gewogen resultaat voor elke rij wanneer de gewichten uitlijnen met de kolommen.H
homogene opslag
np.array([2, 3.5]) wordt het gehele invoergetal een float, zodat beide elementen drijvendekommaopslag delen.I
index
index van het maximum
[3, 8, 8, 2] geeft argmax de waarde 1 terug, een positie en niet de maximumwaarde 8.indexering met indexarrays
a[[4, 1, 4]] neemt positie 4 twee keer mee en behoudt de gevraagde uitvoervolgorde.indirect sorteren
names[np.argsort(scores)] om namen op score te ordenen zonder de koppeling tussen naam en score te verliezen.K
kolomsgewijs stapelen
np.column_stack om per persoon één record met twee metingen te maken.kopie
saved = data[:3].copy() bewaar je een onafhankelijke deelverzameling voor latere wijzigingen of vergelijkingen.kwantiel
np.quantile(x, 0.75) vraagt bij overeenkomstige opties dezelfde positie als np.percentile(x, 75).M
mediaan
[1, 3, 6, 100] is 4,5, hoewel de ongewoon grote laatste waarde het gemiddelde sterk verhoogt.N
naar beneden afronden
np.floor past dit op elke invoerwaarde toe.np.floor de waarde −3,0, omdat −2 boven de oorspronkelijke negatieve waarde zou liggen.naar boven afronden
np.ceil past dit op arraywaarden toe.np.ceil de waarde −2,0, terwijl de functie voor 2,3 de waarde 3,0 geeft.NaN
[4.0, np.nan, 8.0] vereisen drijvendekommaopslag en np.isnan herkent de ontbrekende positie.ndarray
(50, 3).niet-geïnitialiseerde array
np.empty(100) alleen als de daaropvolgende code elk item vult voordat een berekening het gebruikt.normale verdeling
rng.normal kunt trekken.loc=100 en scale=4 gebruikt verdelingsgemiddelde 100 en standaardafwijking 4, niet variantie 4.O
oneindig
inf of -inf en als niet-eindig wordt herkend.inf op met een waarschuwing.opsplitsen
array_split staat ongelijke lengtes van delen toe.np.arange(9) splitsen op [2, 6] geeft delen met lengtes 2, 4 en 3 omdat de getallen grenzen zijn.overloop bij gehele getallen
uint8-arrays met 250 en 10 optellen geeft door terugloop 4, omdat dat datatype geen 260 kan bevatten.P
percentiel
permutatie
rng.permutation(n) in niet-overlappende indexdeelbereiken om elk record aan precies één deelverzameling toe te wijzen.proef
pseudowillekeurige reeks
R
reductieas
keepdims wordt behouden.(6, 4) laat vorm (6,) over, met één resultaat per oorspronkelijke rij.rijgewijze volgorde
[0, 1, 2, 3, 4, 5] naar (2, 3) komt [0, 1, 2] in de eerste rij.S
selectie met een gehele index
(8, 3) geeft data[:, 1] de vorm (8,) terug na verwijdering van de kolomas.simulatie
standaardafwijking
std() worden samengevat gebruiken standaard deler N; ddof=1 kiest de steekproefformule.standaardfout
standaardiseren
(X - X.mean(axis=0)) / X.std(axis=0) standaardiseert kolommen waarvan de standaardafwijking niet nul is.stapelen
(3, 5), met één invoervector per rij.stapgrootte
np.arange.np.arange(2, 15, 4) gebruikt een stapgrootte van 4 om de reeks [2 6 10 14] te maken.startwaarde
np.random.default_rng(17) aan het begin maken geeft een herhaalbaar startpunt voor de analyse.steekproeftrekking met teruglegging
rng.choice.T
toekenning via indexering
data[:2, 0] = 0 vervangt de waarden in de eerste kolom van de eerste twee rijen van de tabel.toevalswandeling
cumsum(axis=1) toepassen maakt afzonderlijke wandelingsposities langs elke proefrij.transpositie
(2, 5) geeft vorm (5, 2), waarbij elke oorspronkelijke kolom een rij wordt.typeconversie
astype geeft een geconverteerde kopie terug en sommige conversies laten informatie verloren gaan.np.array([2.7, 5.1]).astype(int) converteert de waarden naar 2 en 5 zonder naar de dichtstbijzijnde waarde af te ronden.U
unaire ufunc
np.abs aanroepen op een vector met fouten met teken levert een vector met hun groottes op.unieke waarden
np.unique geeft ze gesorteerd terug en kan ook hun bijbehorende aantallen teruggeven.universele functie
np.sqrt(distances_squared) berekent op elke positie een wortel zonder de scalaire functie math.sqrt van Python te gebruiken.V
vectorisatie
price * quantity berekent elk regeltotaal zonder afzonderlijke Python-lus over artikelen.volledige rij
~np.isnan(data).any(axis=1) maakt één waar item voor elk volledig record in een numerieke tabel.voorwaardelijke samenvatting
mass[batch == 'B'].mean() berekent alleen het gemiddelde van massa's waarvan het bijbehorende batchlabel B is.voorwaardelijke selectie
np.where maakt een resultaat door op ware posities de ene invoer en op onware posities de andere te kiezen.np.where(x < 0, 0, x) vervangt negatieve waarden door nul in een nieuw resultaat met dezelfde totale selectievorm.vorm
(2, 6) beschrijft twee rijen van zes waarden, terwijl vorm (12,) één vector van twaalf waarden beschrijft.vorm wijzigen
(4, 3) als elke rij de drie maanden van één kwartaal moet bevatten.vrijheidsgradencorrectie
ddof in hoeveel van het aantal waarden wordt afgetrokken in de deler voor een variantie of standaardafwijking.ddof=1 deelt NumPy het totaal van de gekwadrateerde afwijkingen door vier.W
weergave
b = a[1:4] verandert b[0] = 50 de waarde van a[1], omdat het gewone deelbereik gegevens deelt.Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.