Strukturierte Arrays in NumPy

NumPyBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie strukturierte Arrays in NumPy kennen. Strukturierte Arrays sind ein leistungsstarkes Feature für die Arbeit mit heterogenen Daten, ähnlich wie Tabellen in einer Datenbank oder einer Tabellenkalkulation. Jedes Element eines strukturierten Arrays kann als Zeile betrachtet werden, mit benannten Spalten, die als "Felder" bezeichnet werden. Dies macht sie ideal für die Organisation und Manipulation von tabellarischen Daten direkt in Python.

Während dieses Labs werden Sie Python-Code in der Datei structured_arrays.py schreiben und ausführen, die im WebIDE bereitgestellt wird.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Anfänger mit einer Abschlussquote von 98% ist. Es hat eine positive Bewertungsrate von 98% von den Lernenden erhalten.

Erstellen und Zugreifen auf ein strukturiertes Array

Zuerst erstellen wir ein einfaches strukturiertes Array. Der Datentyp (dtype) eines strukturierten Arrays wird als Liste von Tupeln definiert. Jedes Tupel spezifiziert ein Feld mit seinem (name, data_type). Dies ermöglicht es uns, verschiedene Datentypen wie Strings und Ganzzahlen im selben Array zu speichern.

Öffnen Sie die Datei structured_arrays.py aus dem Dateiexplorer im linken Bereich. Fügen Sie den folgenden Code hinzu, um ein strukturiertes Array zu erstellen, das eine Liste von Personen mit ihren Namen und Altersangaben darstellt.

## Create a structured array
data = np.array([('Alice', 25, 55.5), ('Bob', 30, 68.0)],
                dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])

print("Original Array:")
print(data)

## Access a specific field by its name
names = data['name']
print("\nNames field:")
print(names)

Code-Erklärung:

  • import numpy as np: Diese Zeile importiert die NumPy-Bibliothek.
  • np.array([...], dtype=[...]): Wir erstellen ein Array. Das erste Argument ist eine Liste von Tupeln, wobei jedes Tupel ('Alice', 25, 55.5) eine Datenzeile darstellt.
  • dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')]: Dies ist der entscheidende Teil. Wir definieren drei Felder:
    • 'name': Ein Unicode-String mit einer maximalen Länge von 10 Zeichen (U10).
    • 'age': Eine 4-Byte (32-Bit) Ganzzahl (i4).
    • 'weight': Eine 4-Byte (32-Bit) Gleitkommazahl (f4).
  • data['name']: Wir können auf alle Werte eines bestimmten Feldes (Spalte) zugreifen, indem wir seinen Namen als Index verwenden, was ein neues NumPy-Array zurückgibt.

Speichern Sie nun die Datei und führen Sie sie im Terminal aus, um die Ausgabe zu sehen.

python structured_arrays.py

Sie sollten die folgende Ausgabe sehen, die das vollständige strukturierte Array und das Array, das nur die Namen enthält, anzeigt.

Original Array:
[('Alice', 25, 55.5) ('Bob', 30, 68. )]

Names field:
['Alice' 'Bob']

Felder ändern und Indizieren

Strukturierte Arrays sind veränderbar (mutable), was bedeutet, dass Sie ihre Werte ändern können. Sie können ein gesamtes Feld auf einmal ändern oder über seinen Index auf ein bestimmtes Element zugreifen und dann dessen Feld modifizieren. Sie können auch ein neues Array erstellen, das eine Teilmenge der ursprünglichen Felder enthält.

Fügen Sie den folgenden Code am Ende Ihres structured_arrays.py-Skripts hinzu.

## Modify the 'age' field
data['age'] = [26, 31]
print("\nArray after modifying age:")
print(data)

## Access a single element (the first row)
first_person = data[0]
print("\nFirst person's data:")
print(first_person)

## Create a new array with a subset of fields
subset = data[['name', 'weight']]
print("\nSubset of array (name and weight):")
print(subset)

Code-Erklärung:

  • data['age'] = [26, 31]: Dies weist dem Feld age eine neue Liste von Werten zu und aktualisiert die gesamte Spalte.
  • data[0]: Dies greift auf das erste Element (Zeile) des Arrays zu. Das Ergebnis ist ein NumPy void scalar, der die Daten für diese einzelne Zeile enthält.
  • data[['name', 'weight']]: Durch Übergabe einer Liste von Feldnamen können Sie mehrere Spalten auswählen, was ein neues strukturiertes Array nur mit diesen Feldern erstellt.

Speichern Sie die Datei und führen Sie sie erneut im Terminal aus.

python structured_arrays.py

Ihre Ausgabe enthält nun die neuen Abschnitte, die das geänderte Array und die Teilmenge anzeigen.

... (previous output) ...

Array after modifying age:
[('Alice', 26, 55.5) ('Bob', 31, 68. )]

First person's data:
('Alice', 26, 55.5)

Subset of array (name and weight):
[('Alice', 55.5) ('Bob', 68. )]

Verwendung von Record Arrays für Attributzugriff

Während die Indizierung nach Namen (z. B. data['name']) leistungsfähig ist, kann sie umständlich sein. NumPy bietet eine spezielle Unterklasse von ndarray namens Record Array (np.recarray). Record Arrays ermöglichen es Ihnen, auf Felder als Attribute zuzugreifen, indem Sie die Punktnotation verwenden (z. B. record_array.name), was Ihren Code sauberer und lesbarer machen kann.

Sie können ein Record Array direkt erstellen oder ein vorhandenes strukturiertes Array konvertieren. Sehen wir uns an, wie beides geht. Fügen Sie den folgenden Code am Ende von structured_arrays.py hinzu.

## Convert the structured array to a record array using view()
record_array = data.view(np.recarray)

print("\nType of the new view:")
print(type(record_array))

## Access fields using attribute (dot) notation
print("\nAccessing names via attribute:")
print(record_array.name)

print("\nAccessing ages via attribute:")
print(record_array.age)

Code-Erklärung:

  • data.view(np.recarray): Die Methode .view() erstellt ein neues Array-Objekt, das auf dieselben Daten zugreift. Durch die Angabe von np.recarray erhalten wir eine Record Array-Ansicht unserer strukturierten Array-Daten. Es werden keine Daten kopiert; es ist lediglich eine andere Möglichkeit, mit ihnen zu interagieren.
  • record_array.name: Dies ist das Hauptmerkmal von Record Arrays. Sie können auf das Feld name zugreifen, als wäre es ein Attribut des Objekts. Dies ist äquivalent zu record_array['name'].

Speichern Sie die Datei und führen Sie sie aus.

python structured_arrays.py

Die Ausgabe zeigt nun den Typ der neuen Array-Ansicht und demonstriert den Attributzugriff.

... (previous output) ...

Type of the new view:
<class 'numpy.recarray'>

Accessing names via attribute:
['Alice' 'Bob']

Accessing ages via attribute:
[26 31]

Zusammenfassung

In diesem Lab haben Sie die Grundlagen der Verwendung von strukturierten Arrays in NumPy gelernt. Sie haben mit der Erstellung eines strukturierten Arrays mit benannten Feldern und mehreren Datentypen begonnen. Anschließend haben Sie das Zugreifen auf spezifische Felder (Spalten) mithilfe von Schlüsselindizierung im Stil eines Wörterbuchs und das Ändern ihrer Werte geübt. Schließlich haben Sie Record Arrays erkundet, eine praktische Alternative, die den Zugriff auf Felder als Attribute ermöglicht, und gelernt, wie man mit der .view()-Methode zwischen Standard-strukturierten Arrays und Record Arrays konvertiert.

Strukturierte Arrays sind ein wesentliches Werkzeug für die Verarbeitung komplexer, tabellarischer Datensätze in der wissenschaftlichen Datenverarbeitung und Datenanalyse mit Python.