Ontgrendel het volledige potentieel van NumPy met geavanceerde array indexing technieken. Leer boolean indexing, fancy indexing en slicing voor efficiënte dataselectie.
NumPy Array Indexing: Geavanceerde Selectietechnieken Beheersen
NumPy, de hoeksteen van wetenschappelijk computergebruik in Python, biedt krachtige tools voor het verwerken van grote, multi-dimensionale arrays en matrices. Hoewel basis indexing en slicing fundamenteel zijn, houdt het echt beheersen van NumPy in dat men zich verdiept in de meer geavanceerde selectietechnieken. Deze methoden maken geavanceerde datamanipulatie mogelijk, waardoor gebruikers precies de informatie kunnen extraheren die ze nodig hebben met opmerkelijke efficiëntie. Deze post leidt u door de ingewikkeldheden van boolean indexing en fancy indexing, en biedt praktische voorbeelden en inzichten voor een wereldwijd publiek.
De Basis Begrijpen: Basis Indexing en Slicing
Voordat we ons wagen aan geavanceerd gebied, is een korte samenvatting van basis indexing en slicing nuttig. Voor een 1D-array is indexing eenvoudig: arr[i] haalt het element op index i op. Slicing gebruikt de syntaxis arr[start:stop:step] om een reeks elementen te selecteren.
Voor 2D-arrays strekt indexing zich uit tot het selecteren van rijen en kolommen. Bijvoorbeeld, arr[row, column] geeft toegang tot een specifiek element. Slicing kan onafhankelijk worden toegepast op rijen en kolommen: arr[row_slice, column_slice].
Beschouw een simpele 2D-array:
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# Toegang tot een element
print(arr_2d[1, 2]) # Output: 6
# Slicing van rijen en kolommen
print(arr_2d[0:2, 1:3])
# Output:
# [[2 3]
# [5 6]]
Hoewel effectief, kunnen deze methoden omslachtig worden bij het omgaan met complexe selectiecriteria. Hier komen geavanceerde indexing technieken van pas.
Boolean Indexing: Gegevens Selecteren op Basis van Voorwaarden
Boolean indexing, vaak aangeduid als voorwaardelijke selectie, stelt u in staat om elementen uit een array te selecteren op basis van een boolean voorwaarde. Dit is een ongelooflijk krachtige techniek voor het filteren van gegevens. U maakt een boolean array met dezelfde vorm als de originele array, waarbij True aangeeft dat het bijbehorende element moet worden geselecteerd, en False exclusie aangeeft.
Hoe het Werkt
Het proces omvat typisch het uitvoeren van een vergelijkingsbewerking op de array. Deze bewerking retourneert een boolean array. U gebruikt deze boolean array vervolgens om de originele array te indexeren.
Voorbeeld 1: Elementen Selecteren Groter dan een Waarde
Stel dat u een dataset heeft met wereldwijde temperaturen en u wilt alle dagen identificeren waarop de temperatuur een bepaalde drempel overschreed.
# Ga uit van een 1D-array van temperaturen uit verschillende steden over de hele wereld
temperaturen = np.array([25.5, 31.2, 18.9, 28.7, 22.1, 35.0, 15.6])
# Stel een drempel in
drempel = 28.0
# Maak een boolean mask
hoge_temperaturen_mask = temperaturen > drempel
print(hoge_temperaturen_mask)
# Output: [False True False True False True False]
# Gebruik het mask om elementen te selecteren
hete_dagen = temperaturen[hoge_temperaturen_mask]
print(hete_dagen)
# Output: [31.2 28.7 35. ]
Dit selecteert beknopt alle temperaturen boven 28,0 graden. De output is een nieuwe 1D-array die alleen de waarden bevat die aan de voorwaarde voldeden.
Voorbeeld 2: Werken met 2D-arrays
Boolean indexing kan ook worden toegepast op multi-dimensionale arrays. Bij gebruik met een 2D-array retourneert een boolean mask met dezelfde vorm een 1D-array die alle elementen bevat waarvoor het mask True is.
# Een 2D-array die verkoopcijfers voor verschillende producten in verschillende regio's vertegenwoordigt
verkoop_gegevens = np.array([[150, 200, 120],
[300, 180, 250],
[90, 220, 160]])
# Identificeer verkoopcijfers boven een bepaald doel
doel_verkoop = 200
# Maak een boolean mask
succesvolle_verkoop_mask = verkoop_gegevens >= doel_verkoop
print(succesvolle_verkoop_mask)
# Output:
# [[False True False]
# [ True False True]
# [False True False]]
# Selecteer de bijbehorende verkoopcijfers
geselecteerde_verkoop = verkoop_gegevens[succesvolle_verkoop_mask]
print(geselecteerde_verkoop)
# Output: [200 300 250 220]
Dit retourneert een 1D-array van alle verkoopcijfers die het doel hebben bereikt of overschreden. Het is een krachtige manier om multidimensionale gegevens te filteren zonder expliciete loops.
Boolean Indexing met Meerdere Voorwaarden
U kunt meerdere boolean voorwaarden combineren met behulp van logische operatoren:
&: Element-gewijze logische EN|: Element-gewijze logische OF~: Element-gewijze logische NIET
Belangrijke Opmerking: Bij het combineren van voorwaarden moet elke individuele voorwaarde tussen haakjes worden geplaatst vanwege de voorrang van Python-operatoren.
# Selecteer verkoopcijfers die tussen 150 en 250 (inclusief) liggen
voorwaarde_laag = verkoop_gegevens >= 150
voorwaarde_hoog = verkoop_gegevens <= 250
tussen_150_en_250 = verkoop_gegevens[voorwaarde_laag & voorwaarde_hoog]
print(tussen_150_en_250)
# Output: [150 200 180 250 220 160]
Dit demonstreert hoe u gegevens kunt extraheren die binnen een specifiek bereik vallen, een veelvoorkomende taak in data-analyse.
Fancy Indexing: Elementen Selecteren met behulp van Integer Arrays
Fancy indexing is een andere geavanceerde selectietechniek waarmee u elementen kunt selecteren met behulp van arrays van integers. Dit verschilt van slicing, dat aaneengesloten blokken van gegevens selecteert. Fancy indexing stelt u in staat willekeurige elementen uit een array te kiezen op basis van hun indices.
Hoe het Werkt
U geeft een array van indices aan de indexoperator. NumPy retourneert dan een nieuwe array waarbij de elementen zijn geordend volgens de opgegeven indices.
Voorbeeld 1: Specifieke Elementen Selecteren in een 1D-array
Stel u voor dat u een lijst met gebruikers-ID's heeft en dat u alleen gegevens wilt ophalen voor specifieke gebruikers.
# Een lijst met voorbeeldgebruikers-ID's
gebruikers_ids = np.array([101, 105, 110, 102, 115, 108])
# Indices van de gebruikers waarin we geïnteresseerd zijn
geselecteerde_indices = np.array([0, 3, 5]) # Komt overeen met gebruikers-ID's op index 0, 3 en 5
# Selecteer de gegevens voor deze gebruikers
geselecteerde_gebruikers = gebruikers_ids[geselecteerde_indices]
print(geselecteerde_gebruikers)
# Output: [101 102 108]
Dit retourneert een nieuwe array die alleen de gebruikers_ids op de opgegeven indices bevat.
Voorbeeld 2: Fancy Indexing met 2D-arrays
Fancy indexing wordt vooral krachtig met multi-dimensionale arrays. Wanneer u integer arrays gebruikt voor het indexeren van een 2D-array, kunt u specifieke rijen, kolommen of zelfs afzonderlijke elementen op een niet-aaneengesloten manier selecteren.
Er zijn twee primaire manieren om fancy indexing met 2D-arrays te gebruiken:
- Rijen Selecteren: Geef een 1D-array met rij-indices.
- Specifieke Elementen Selecteren (Rij, Kolom-paren): Geef twee 1D-arrays met indices op – een voor rijen en een voor kolommen. Deze arrays moeten dezelfde lengte hebben, en het i-de element van de rij-indexarray en het i-de element van de kolom-indexarray specificeren een uniek element dat moet worden geselecteerd.
Specifieke Rijen Selecteren
Laten we een dataset met aandelenkoersen voor verschillende bedrijven over meerdere dagen bekijken. We willen de gegevens voor specifieke bedrijven ophalen.
# Aandelenkoersen voor 3 bedrijven over 4 dagen
# Rijen vertegenwoordigen dagen, kolommen vertegenwoordigen bedrijven
aandelenkoersen = np.array([[100, 150, 200],
[105, 152, 205],
[110, 155, 210],
[115, 160, 215]])
# Indices van de bedrijven die we willen onderzoeken (bijv. bedrijf op index 0 en bedrijf op index 2)
bedrijf_indices = np.array([0, 2])
# Selecteer de gegevens voor deze bedrijven over alle dagen
geselecteerde_bedrijven_gegevens = aandelenkoersen[:, bedrijf_indices]
print(geselecteerde_bedrijven_gegevens)
# Output:
# [[100 200]
# [105 205]
# [110 210]
# [115 215]]
Hier selecteert : alle rijen, en bedrijf_indices selecteert specifieke kolommen. Het resultaat is een nieuwe 2D-array waarbij elke kolom overeenkomt met de geselecteerde bedrijven.
Specifieke Elementen Selecteren met behulp van Rij- en Kolomparen
Hier biedt fancy indexing de meeste flexibiliteit. U kunt willekeurige elementen vastpinnen door hun rij- en kolomindices tegelijkertijd op te geven.
# Een raster dat de bevolkingsdichtheid over verschillende zones en sectoren weergeeft
bevolkingsdichtheid = np.array([[1000, 1200, 800, 1500],
[900, 1100, 750, 1400],
[1300, 1400, 950, 1600],
[850, 1050, 700, 1350]])
# We willen de dichtheid controleren bij specifieke zone-sectorcombinaties.
# Laten we zeggen dat we geïnteresseerd zijn in:
# - Zone 0, Sector 1 (rij 0, kol 1)
# - Zone 2, Sector 0 (rij 2, kol 0)
# - Zone 1, Sector 3 (rij 1, kol 3)
# - Zone 3, Sector 2 (rij 3, kol 2)
rij_indices = np.array([0, 2, 1, 3])
kolom_indices = np.array([1, 0, 3, 2])
# Selecteer de bevolkingsdichtheden op deze specifieke locaties
specifieke_locatie_dichtheid = bevolkingsdichtheid[rij_indices, kolom_indices]
print(specifieke_locatie_dichtheid)
# Output: [1200 1300 1400 700]
De output is een 1D-array die de bevolkingsdichtheden bevat op de exacte coördinaten die worden gespecificeerd door de paren indices.
Belangrijk inzicht: De vorm van de output-array wordt bepaald door de vorm van de indexarrays. Als beide indexarrays 1D zijn en dezelfde lengte N hebben, is de output een 1D-array met lengte N. Als een van de indexarrays multi-dimensionaal is, erft de output-array die vorm.
Fancy Indexing en Broadcasting
Bij het gebruik van fancy indexing met meerdere indexarrays met verschillende vormen, komen de broadcastingregels van NumPy in het spel. Als u bijvoorbeeld een 2D-array indexeert met een 1D-array voor rijen en een enkele integer voor kolommen, zal broadcasting die enkele kolomindex effectief uitbreiden om overeen te komen met het aantal rijen.
# Laten we alle elementen uit de eerste twee rijen selecteren, maar alleen uit de derde kolom
indices_rijen = np.array([0, 1]) # Indices van rijen
index_kolom = 2 # Index van de kolom
geselecteerde_subset = bevolkingsdichtheid[indices_rijen, index_kolom]
print(geselecteerde_subset)
# Output: [800 750]
In dit geval wordt index_kolom (dat 2 is) uitgezonden om overeen te komen met de vorm van indices_rijen (dat (2,) is), waardoor effectief indexparen (0, 2) en (1, 2) worden gemaakt.
Boolean en Fancy Indexing Combineren
U kunt ook boolean indexing en fancy indexing combineren om nog complexere selectiepatronen te creëren. U kunt bijvoorbeeld eerst rijen filteren op basis van een voorwaarde en vervolgens fancy indexing gebruiken om specifieke kolommen uit die gefilterde rijen te selecteren.
Laten we het verkoop_gegevens voorbeeld opnieuw bekijken:
# verkoop_gegevens = np.array([[150, 200, 120],
# [300, 180, 250],
# [90, 220, 160]])
# Laten we zeggen dat we alleen rijen willen overwegen waar ten minste één verkoopcijfer boven de 200 ligt
# Maak een boolean mask voor rijen
# We controleren of een element in een rij groter is dan 200
rij_mask = np.any(verkoop_gegevens > 200, axis=1)
print(rij_mask)
# Output: [False True True]
# Pas dit rijmask toe om relevante rijen te selecteren
gefilterde_rijen = verkoop_gegevens[rij_mask]
print(gefilterde_rijen)
# Output:
# [[300 180 250]
# [ 90 220 160]]
# Laten we nu, van deze gefilterde rijen, fancy indexing gebruiken om specifieke kolommen te selecteren.
# Stel dat we de eerste en derde kolommen willen van deze gefilterde rijen.
rij_indices_voor_fancy = np.array([0, 1]) # Indices binnen de gefilterde_rijen array
kolom_indices_voor_fancy = np.array([0, 2]) # Indices van kolommen die we willen
eind_selectie = gefilterde_rijen[rij_indices_voor_fancy, kolom_indices_voor_fancy]
print(eind_selectie)
# Output: [300 160]
Dit voorbeeld illustreert een scenario waarin u eerst uw gegevens filtert op basis van een brede voorwaarde (rijen met hoge verkopen) en vervolgens selectief specifieke gegevenspunten extraheert uit die gefilterde rijen.
Praktische Toepassingen en Mondiale Perspectieven
Deze geavanceerde indexing technieken zijn niet alleen theoretische constructies; het zijn onmisbare tools in real-world data science toepassingen over de hele wereld:
- Financiële Analyse: Selecteren van aandelenkoersen voor specifieke bedrijven op bepaalde data, of het identificeren van transacties die aan bepaalde winstgevendheidsdrempels voldoen.
- Klimaatwetenschap: Filteren van temperatuur- of neerslaggegevens voor specifieke geografische regio's of tijdsperioden op basis van gedefinieerde criteria. Zoals het identificeren van droogtegevoelige regio's (bijv. delen van Australië, de Sahel-regio in Afrika) door gegevens te selecteren onder een bepaalde regenvalbenchmark.
- E-commerce: Segmenteren van klantgegevens om klanten met hoge waarde of producten met specifieke verkoopcijfers in verschillende markten te identificeren (bijv. Europa, Azië, Noord-Amerika).
- Gezondheidszorg: Analyseren van patiëntgegevens om records te selecteren van personen met specifieke aandoeningen of behandelgeschiedenissen in verschillende populaties.
- Machine Learning: Datasets voorbereiden door functies of voorbeelden te selecteren op basis van complexe criteria, of modelcoëfficiënten te extraheren voor specifieke parameters.
De mogelijkheid om gegevens nauwkeurig en efficiënt te selecteren is cruciaal voor het bouwen van accurate modellen, het afleiden van betekenisvolle inzichten en het nemen van weloverwogen beslissingen, ongeacht geografische locatie of industrie.
Prestatieoverwegingen
De geavanceerde indexing van NumPy is sterk geoptimaliseerd. Bewerkingen die expliciete Python-loops zouden vereisen, worden vaak door NumPy gevectoriseerd, wat leidt tot aanzienlijke prestatiewinst. Het is echter belangrijk om op de hoogte te zijn van een paar nuances:
- Boolean indexing retourneert over het algemeen een 1D-array met geselecteerde elementen. Als u de originele vorm voor bepaalde bewerkingen wilt behouden, moet u mogelijk reshape of andere technieken gebruiken.
- Fancy indexing retourneert een kopie van de gegevens. Als de indexarrays gehele getallen zijn, is het resultaat een kopie. Als de indexarrays boolean zijn, is het resultaat ook een kopie. Dit betekent dat wijzigingen in de geretourneerde array de originele array niet beïnvloeden.
- Voor zeer grote arrays en complexe indexing schema's kan het geheugengebruik een factor worden. NumPy-bewerkingen creëren intermediaire arrays, die geheugen verbruiken.
Wanneer de prestaties cruciaal zijn, vooral in tijdsgevoelige applicaties of bij het werken met enorme datasets, kan het profileren van uw code en het begrijpen van de onderliggende NumPy-bewerkingen u helpen verder te optimaliseren. Dit kan inhouden dat u kiest tussen boolean en fancy indexing, of dat u uw gegevens herstructureert.
Best Practices voor Geavanceerde Indexing
Om de geavanceerde indexing mogelijkheden van NumPy effectief te benutten:
- Begrijp uw gegevens: Definieer duidelijk de criteria voor selectie voordat u code schrijft.
- Gebruik betekenisvolle variabele namen: Noem uw boolean masks en index arrays beschrijvend (bijv.
hoge_waarde_klanten_mask,doel_product_indices). - Prioriteer leesbaarheid: Hoewel beknopte code goed is, prioriteer code die gemakkelijk te begrijpen is voor anderen (en uw toekomstige zelf). Gebruik haakjes op de juiste manier voor gecombineerde boolean voorwaarden.
- Test incrementeel: Bouw complexe indexing bewerkingen stap voor stap op en verifieer de output in elke fase.
- Maak gebruik van NumPy-functies: Gebruik functies zoals
np.where()voor voorwaardelijke selectie die indices of waarden kunnen retourneren, of `np.ix_()` voor het maken van een volledig raster van indexarrays, wat nuttig kan zijn in specifieke scenario's. - Houd rekening met kopieën versus weergaven: Onthoud dat fancy indexing en boolean indexing doorgaans kopieën retourneren, geen weergaven van de originele gegevens.
Conclusie
De geavanceerde array indexing technieken van NumPy, namelijk boolean indexing en fancy indexing, zijn essentieel voor het uitvoeren van geavanceerde dataselectie en -manipulatie in Python. Ze stellen data scientists, analisten en onderzoekers wereldwijd in staat om precies de gegevens te extraheren die ze nodig hebben, waardoor diepere inzichten en robuustere analyses mogelijk worden. Door deze technieken te beheersen, kunt u de volledige kracht van NumPy ontsluiten voor uw datagestuurde projecten en bijdragen aan de vooruitgang op gebieden variërend van wereldwijde financiën en klimaatonderzoek tot gepersonaliseerde geneeskunde en kunstmatige intelligentie. Blijf deze krachtige selectiemethoden verkennen, experimenteren en integreren in uw NumPy-workflow.