Gemaskeerde arrays — NumPy v1.20 Handleiding (2024)

Voorwaarden

Voordat u deze tutorial leest, moet u een beetje Python kennen.Als u uw geheugen wilt vernieuwen, bekijk dan dePython-tutorial.

Als u de voorbeelden in deze zelfstudie wilt kunnen uitvoeren, moet u dat ook doenmatplotlibop uw computer geïnstalleerd.

Leerlingprofiel

Deze zelfstudie is voor mensen die een basiskennis van Numpy hebben en willen begrijpen hoe gemaskerde arrays en denumpy.maModule kan worden gebruikt in het werk.

leerdoelen

Na deze zelfstudie zou je moeten kunnen:

  • Begrijp wat gemaskeerde arrays zijn en hoe ze kunnen worden gemaakt

  • Begrijp hoe u toegang kunt krijgen en gegevens kunt wijzigen voor gemaskerde arrays

  • Bepaal wanneer het gebruik van gemaskerde arrays geschikt is in sommige van uw toepassingen

Wat zijn gemaskeerde arrays?

Beschouw het volgende probleem. U heeft een gegevensset met ontbrekende of ongeldige gegevens. Als u enige vorm van verwerking van deze gegevens uitvoert en dat wiltoverslaanOf markeer deze ongewenste vermeldingen zonder ze gewoon te verwijderen, u kunt op de een of andere manier conditionals gebruiken of uw gegevens filteren.Denumpy.mamodule biedt een deel van dezelfde functionaliteit alsNumPy ndarraysmet toegevoegde structuur om ervoor te zorgen dat de invoer in de berekening niet wordt gebruikt.

Van deReferentie gids:

Een gemaskeerde array is de combinatie van een standaardnumpy.ndarrayJijmasker.Een masker is ookgeen masker, wat aangeeft dat geen waarde van de gesloten array ongeldig is, of een reeks booleans die een foreach -element van de bijbehorende array bepaalt of de waarde geldig is of niet. Wanneer een element van het masker isVals, is het corresponderende element van de bijbehorende array geldig en wordt er gezegd dat deze is ontmaskerd. Wanneer een element van het masker dat isWAAR, het overeenkomstige element van de bijbehorende array die is gemaskeerd (ongeldig).

Wij kunnen denken aan eenMaskedArrayals combinatie van:

  • Gegevens, als een regelmatigenumpy.ndarrayvan welke vorm of datatype dan ook;

  • Een Booleaans masker met dezelfde vorm als de gegevens;

  • Afill_value, een waarde die kan worden gebruikt om de ongeldige vermeldingen te vervangen om een ​​standaard te retournerennumpy.ndarray.

Wanneer kunnen ze nuttig zijn?

Er zijn een paar situaties waarin gemaskeerde arrays nuttiger kunnen zijn dan alleen het elimineren van de ongeldige vermeldingen van een array:

  • Wanneer u de waarden die u hebt gemaskeerd voor latere verwerking wilt behouden, zonder de array te kopiëren;

  • Wanneer u met veel arrays te maken heeft, elk met hun eigen masker. Als het masker deel uitmaakt van de array, voorkom je bugs en is de code mogelijk compacter;

  • Wanneer u verschillende vlaggen hebt voor het missen van of ongeldige waarden en deze vlaggen naar boven wenst zonder ze te vervangen in de oorspronkelijke gegevensset, buien ze uit berekeningen;

  • Als u ontbrekende waarden niet kunt vermijden of elimineren, maar niet wilt omgaanNaar binnen(Geen getal) waarden in uw bewerkingen.

Gemaskerde arrays zijn ook een goed idee sinds denumpy.mamodule wordt ook geleverd met een specifieke implementatie van de meesteNumpy Universal Functions (Ufuncs)wat betekent dat u nog steeds snelle vectorized functies en bewerkingen op gemaskerde gegevens kunt toepassen.De uitvoer is dan een gemaskerde array. We zullen enkele voorbeelden zien van hoe dit in de praktijk hieronder werkt.

Gemaskeerde arrays gebruiken om COVID-19-gegevens te bekijken

VanKaggleHet is mogelijk om een gegevensset te downloaden met initiële gegevens over de uitbraak van COVID-19 in Yebining van 2020. We gaan kijken naar een kleine subset van deze gegevens, opgenomen in het bestandwho_covid_19_sit_rep_time_series.csv.

In 1]:importeren numpig als NPIn 2]:importeren os# De functie os.getcwd () retourneert de huidige map;je kan veranderen# de bestandspadvariabele die verwijst naar de map waarin u het .csv-bestand hebt opgeslagenIn [3]:bestandspad = os.Getcwd()In [4]:bestandsnaam = os.pad.meedoen((bestandspad,, "wie_covid_19_sit_rep_time_series.csv")

Het gegevensbestand bevat gegevens van verschillende typen en is als volgt georganiseerd:

  • De eerste rij is een koplijn die (meestal) de gegevens beschrijft in elke kolom die in de onderstaande rijen volgen, en beginnend in de vierde kolom, is de koptekst de datum van de observatie.

  • De tweede tot en met de zevende rij bevatten samenvattende gegevens die van een ander type zijn dan wat we gaan onderzoeken, dus die zullen we moeten uitsluiten van de gegevens waarmee we gaan werken.

  • De numerieke gegevens waarmee we willen werken, beginnen bij kolom 4, rij 8 en strekken zich uit van de meest rechtse kolom en de onderste rij.

Laten we de gegevens in dit bestand verkennen voor de eerste 14 dagen van records.Togather -gegevens van de.csvbestand, we zullen denumpy.genfromtxtFunctie, zorg ervoor dat we alleen de kolommen met werkelijke getallen selecteren in plaats van de eerste drie kolommen die locatiegegevens bevatten.We slaan ook de eerste 7rows van dit bestand over, omdat ze andere gegevens bevatten waar we niet in geïnteresseerd zijn. SCHEIDIG, we zullen de informatie over datums en locatie voor deze gegevens extraheren.

# Opmerking We gebruiken Skip_header en Usecols om alleen delen van de te lezen# gegevensbestand in elke variabele.# Lees alleen de datums voor kolommen 3-7 uit de eerste rijIn [5]:datums = np.genfromtxt((bestandsnaam,, dertje=NP.unicode_,, scheidingsteken=",",,...: max_rijen=1,, gebruik cols=bereik((3,, 17),...: codering="utf-8-sig"))...:# Lees de namen van de geografische locaties uit de eerste twee# kolommen, de eerste zeven rijen overslaanIn [6]:locaties = NP.genfromtxt((bestandsnaam,, dertje=np.unicode_,, scheidingsteken=",",,...: Skip_header=7,, gebruik cols=((0,, 1),...: codering="utf-8-sig"))...:# Lees de numerieke gegevens van alleen de eerste 14 dagenIn [7]:nbcases = NP.genfromtxt((bestandsnaam,, dtype=np.int_,, scheidingsteken=",",,...: Skip_header=7,, USECOLS=bereik((3,, 17),...: codering="utf-8-sig")...:

Ingesloten in denumpy.genfromtxtFunctieaanroep, we hebben denumpy.dtypeVoor elke subset van de gegevens (ofwel een geheel getal -numpy.int_- of een reeks tekens -numpy.unicode_).We hebben ook decoderingargument om te selecterenutf-8-sigals de codering voor het bestand (lees meer over codering in deOfficiële Python -documentatie).Je kan meer lezen over denumpy.genfromtxtfunctie van deReferentiedocumentatieof van deBasic IO -zelfstudie.

De gegevens verkennen

Allereerst kunnen we de hele set gegevens die we hebben in kaart brengen en zien hoe deze eruit ziet. Om een ​​leesbaar plot te krijgen, selecteren we slechts een paar van de data om in ons overzicht weer te gevenx-as teken. Merk ook op dat we in ons plotcommando gebruikennbcases.T(de transponering van denbcasesArray) Aangezien dit betekent dat we elke rij van het bestand als een afzonderlijke regel zullen plotten.We kiezen voor een stippellijn (met behulp van de'-'lijnstijl).Zie dematplotlibdocumentatie voor meer informatie hierover.

In [8]:importeren matplotlib.pyplot als PLTIn [9]:Selected_dates = [0,, 3,, 11,, 13]In [10]:PLT.verhaallijn((data,, nbgevallen.T,, '-');In [11]:PLT.XTICKS((Selected_dates,, data[Selected_dates]);In [12]:plt.titel(("COVID-19 cumulatieve gevallen van 21 januari tot 3 februari 2020");

Masked Arrays — NumPy v1.20 Manual (1)

Opmerking

Als u de bovenstaande opdrachten in de iPython -shell uitvoert, kan het nodig zijn om de opdracht te gebruikenplt.show ()Om het beeldvenster te tonen.Notealso dat we een puntkomma gebruiken aan het einde van een lijn om de uitvoer te onderdrukken, maar dit is optioneel.

De grafiek heeft een vreemde vorm van 24 januari tot 1 februari.Het zou interessant zijn om te weten waar deze gegevens vandaan komen.Als we kijken naar delocatiesarray die we hebben geëxtraheerd uit de.csvBestand, we kunnen zien dat we twee kolommen hebben, waar de eerste regio's zou bevatten en de tweede de naam van het land zou bevatten.Alleen de eerste paar rijen bevatten echter gegevens voor de FirstColumn (provincienamen in China).Hierna hebben we alleen landnamen.SoIT zou zinvol zijn om alle gegevens van China in één rij te groeperen.Forthis, we zullen kiezen uit denbcasesarray alleen de rijen waarvoor de opeenvolgende invoer van delocatiesArray komt overeen met China.Vervolgens gebruiken we denumpy.sumfunctie om alle geselecteerde rijen samen te vatten (as = 0):

In [13]:china_totaal = nbgevallen[locaties[:, 1] == 'China'].som((as=0))In [14]:china_totaalUit[14]:Array ([247, 288, 556, 817, -22, -22, -15, -10, -9,-7, -4, 11820, 14410, 17237])

Er is iets mis met deze gegevens - we mogen geen negatieve waarden hebben in een cumulatieve gegevensset.Wat gebeurd er?

Ontbrekende gegevens

Kijkend naar de gegevens, dit is wat we vinden: er is een periode metontbrekende gegevens:

In [15]:nbgevallenUit [15]:array([[ 258, 270, 375, ..., 7153, 9074, 11177],[14, 17, 26, ..., 520, 604, 683],[-1, 1, 1, ..., 422, 493, 566],...,,[ -1, -1, -1, ..., -1, -1, -1],[ -1, -1, -1, ..., -1, -1, -1],[-1, -1, -1, ..., -1, -1, -1]])

Al de-1Waarden die we zien komen vandaannumpy.genfromtxtProberen om ontbrekende gegevens van het origineel te lezen.csvbestand.Het is duidelijk dat woensdag geen ontbrekende gegevens wil berekenen als-1- We willen gewoon deze waarden overslaan, het interfereert niet in onze analyse.Na het importeren van denumpy.maModule, we maken een nieuwe array, dit keer maskeren we de ongeldige waarden:

In [16]:van numpig importeren maIn [17]:nbcases_ma = ma.Masked_Values((nbcases,, -1)

Als we kijken naar denbcases_magemaskeerde array, dit is wat we hebben:

In [18]:nbcases_maUit [18]:gemaskeerde_array(Data = [[258, 270, 375, ..., 7153, 9074, 11177],[14, 17, 26, ..., 520, 604, 683],[-, 1, 1, ..., 422, 493, 566],...,,[-,-,-, ...,-,-,-],[-,-,-, ...,-,-,-],[-,-,-, ...,-,-,-]],mask=[[Onwaar, Onwaar, Onwaar, ..., Onwaar, Onwaar, Onwaar],[Onwaar, onwaar, niet waar, ..., niet waar, niet waar, niet waar],[Waar, niet waar, niet waar, ..., niet waar, niet waar, niet waar],...,,[Waar, waar, waar, ..., waar, waar, waar],[Waar, waar, waar, ..., waar, waar, waar],[ Waar, waar, waar, ..., waar, waar, waar]],fill_value = -1)

We kunnen zien dat dit een ander soort array is.Zoals vermeld in de inleiding, heeft het drie attributen (gegevens,maskerEnfill_value). Houd er rekening mee dat demaskerattribuut heeft eenWAARwaarde voor elementen die overeenkomen metongeldiggegevens (vertegenwoordigd door twee streepjes in degegevensattribuut).

Opmerking

Toevoegen-1Het ontbreken van gegevens is geen probleem metnumpy.genfromtxt; in dit specifieke geval, het vervangen van de ontbrekende waarde door0Misschien wel goed, maar we zullen later zien dat dit verre van een algemene oplossing is. Het is ook mogelijk om denumpy.genfromtxtfunctie met behulp van degebruik maskerparameter.Alsusemask = true,numpy.genfromtxtRetourneert automatisch een gemaskerde array.

Laten we proberen te zien hoe de gegevens eruit zien uitsluiten van de eerste rij (gegevens van de provincie Hubei in China), zodat we de ontbrekende gegevens kunnen bekijken:

In [19]:PLT.verhaallijn((data,, nbcases_ma[1:].T,, '-');In [20]:plt.XTICKS((Selected_dates,, data[Selected_dates]);In [21]:plt.titel(("COVID-19 cumulatieve gevallen van 21 januari tot 3 februari 2020");

Masked Arrays — NumPy v1.20 Manual (2)

Nu onze gegevens zijn gemaskeerd, laten we proberen alle gevallen in China samen te vatten:

In [22]:China_masked = nbcases_ma[locaties[:, 1] == 'China'].som((as=0)In [23]:China_maskedOut [23]:Masked_Array (data = [278, 309, 574, 835, 10, 10, 17, 22, 23, 25, 28, 11821,14411, 17238],Mask = [false, false, false, false, false, false, false,Vals, Vals, Vals, Vals, Vals, Vals],fill_value = 999999))

Let daar opChina_maskedis een gemaskerde array, dus het heeft een andere gegevensstructuur dan een normale numpy array.Nu hebben we rechtstreeks toegang tot zijn gegevens door de.gegevensattribuut:

In [24]:china_totaal = China_masked.gegevensIn [25]:china_totaalOut [25]:Array ([278, 309, 574, 835, 10, 10, 17, 22, 23,25, 28, 11821, 14411, 17238])

Dat is beter: geen negatieve waarden meer.We kunnen echter nog steeds zien dat voor ooit het cumulatieve aantal gevallen lijkt te dalen (van 835 tot 10, bijvoorbeeld), die niet overeenkomt met de definitie van "cumulatieve gegevens".Als Welook de gegevens nauwer bij de gegevens, in de periode dat er gegevens op het vasteland van China stimuleerden, kunnen zien, waren er geldige gegevens voor Hong Kong, Taiwan, Macau en "niet -gespecificeerde" regio's van China.Misschien kunnen we die uit de thetotale som van gevallen in China verwijderen om de gegevens beter te begrijpen.

Eerst identificeren we de indexen van locaties op het vasteland van China:

In [26]:China_mask = ((locaties[:, 1] == 'China') &....: ((locaties[:, 0] != 'Hong Kong') &....: ((locaties[:, 0] ! = 'Taiwan') &....: ((locaties[:, 0] ! = 'Macau') &....: ((locaties[:, 0] != 'Niet gespecificeerd*'))....:

Nu,China_maskis een array van Booleaanse waarden (WAARofVals);Wecan Controleer of de indices zijn wat we wilden met deMa.nonzeromethode voor gemaskerde arrays:

In [27]:China_mask.niet nul()Out [27]:(matrix([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 31, 33]),)

Nu kunnen we correct ingangen voor het vasteland van China samenvatten:

In [28]:china_totaal = nbcases_ma[China_mask].som((as=0)In [29]:china_totaalUit[29]:Masked_Array (data = [278, 308, 440, 446, -, -, - -,, -, -, -, 11791,14380, 17205],mask = [false, false, false, true, true, true, true,Waar, waar, waar, waar, niet waar, niet waar],fill_value = 999999))

We kunnen de gegevens vervangen door deze informatie en een nieuwe grafiek plotten, gericht op het vasteland van China:

In [30]:plt.verhaallijn((datums,, china_totaal.T,, '-');In [31]:plt.XTICKS((Selected_dates,, datums[Selected_dates]);In [32]:plt.titel(("COVID-19 cumulatieve gevallen van 21 januari tot 3 februari 2020 - vasteland van China");

Masked Arrays — NumPy v1.20 Manual (3)

Het is duidelijk dat gemaskerde arrays hier de juiste oplossing zijn.We kunnen de ontbrekende gegevens niet vertegenwoordigen zonder de evolutie van de curve verkeerd te bescharigen.

Passende gegevens

Een mogelijkheid die we kunnen bedenken, is om de ontbrekende gegevens te interpoleren om het aantal gevallen eind januari te schatten.Merk op dat we de gemaskerde elementen kunnen selecteren met behulp van de.maskerattribuut:

In [33]:china_totaal.maskerUit [33]:array ([false, false, false, false, true, true, true, true, true,Waar, waar, niet waar, niet waar, niet waar])In [34]:ongeldig = china_totaal[china_totaal.masker]In [35]:ongeldigUit[35]:masked_array (data = [-,-,-,-,-,-,-],mask = [waar, waar, waar, waar, waar, waar, waar, waar],fill_value = 999999,Dtype = int64)

We hebben ook toegang tot de geldige vermeldingen met behulp van de logische ontkenning voor deze mask:

In [36]:geldig = china_totaal[~china_totaal.masker]In [37]:geldigUit[37]:Masked_Array (data = [278, 308, 440, 446, 11791, 14380, 17205],Mask = [false, false, false, false, false, false],fill_value = 999999))

Als we nu een zeer eenvoudige benadering voor deze gegevens willen maken, moeten we rekening houden met de geldige vermeldingen rond de ongeldige.Dus laat eerst de data selecteren waarvoor de gegevens geldig zijn.Merk op dat we het masker kunnen gebruiken van dechina_totaalgemaskeerde array om de array van de datums te indexeren:

In [38]:datums[~china_totaal.masker]Out [38]:array (['1/21/20', '1/22/20', '1/23/20', '1/24/20', '2/1/20', '2/2/20',,'2/3/20'], dtype='

Tenslotte kunnen we gebruik maken van denumpy.polyfitEnnumpy.polyvalFuncties om een kubisch polynoom te maken dat zo goed mogelijk bij de gegevens past:

In [39]:T = np.regelen((Len((china_totaal))In [40]:parameters = np.polyfit((T[~china_totaal.masker], geldig,, 3)In [41]:Cubic_fit = np.polyval((params,, T)In [42]:plt.verhaallijn((T,, china_totaal);In [43]:plt.verhaallijn((T,, kubieke_fit,, '-');

Masked Arrays — NumPy v1.20 Manual (4)

Deze plot is niet zo leesbaar omdat de lijnen over elkaar lijken te liggen, vat solet samen in een meer uitgebreide plot. We zullen de echte gegevens in kaart brengen wanneer deze beschikbaar zijn, en de kubieke fit voor niet-beschikbare gegevens weergeven, waarbij we deze fit gebruiken om een ​​schatting te berekenen voor het waargenomen aantal gevallen op 28 januari 2020, 7 dagen na het begin van de records:

In [44]:plt.verhaallijn((T,, china_totaal);In [45]:plt.verhaallijn((T[china_totaal.masker], Cubic_fit[china_totaal.masker], '-',, kleur='oranje');In [46]:plt.verhaallijn((7,, np.polyval((parameters,, 7), 'R*');In [47]:plt.XTICKS([0,, 7,, 13], datums[[0,, 7,, 13]]);In [48]:plt.Yticks([0,, np.polyval((params,, 7), 10000,, 17500]);In [49]:plt.legende(['Vasteland van China',, 'Kubieke schatting',, '7 dagen na het begin']);In [50]:plt.titel(("Covid -19 cumulatieve zaken van 21 januari tot 3 februari 2020 - vasteland China\N"....: "Kubische schatting gedurende 7 dagen na het begin");....:

Masked Arrays — NumPy v1.20 Manual (5)

Meer lezen

Onderwerpen die niet in deze tutorial worden behandeld, zijn te vinden in de documentatie:

  • HardmaskersVs.softmasks

  • De Numpy.MA -module

Gemaskeerde arrays — NumPy v1.20 Handleiding (2024)
Top Articles
Latest Posts
Article information

Author: Domingo Moore

Last Updated:

Views: 5625

Rating: 4.2 / 5 (73 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Domingo Moore

Birthday: 1997-05-20

Address: 6485 Kohler Route, Antonioton, VT 77375-0299

Phone: +3213869077934

Job: Sales Analyst

Hobby: Kayaking, Roller skating, Cabaret, Rugby, Homebrewing, Creative writing, amateur radio

Introduction: My name is Domingo Moore, I am a attractive, gorgeous, funny, jolly, spotless, nice, fantastic person who loves writing and wants to share my knowledge and understanding with you.