Grundlegende Techniken zur Erstellung von NumPy-Arrays

NumPyBeginner
Jetzt üben

Einführung

Voraussetzungen

Bevor Sie mit diesem Kurs beginnen, sollten Sie über grundlegende Python-Programmierkenntnisse verfügen. Wenn Sie Python noch nicht gelernt haben, können Sie mit unserem Python Lernpfad beginnen.

Willkommen zum Lab über grundlegende Techniken zur Erstellung von NumPy-Arrays. Bevor wir mit dem Programmieren beginnen, wollen wir verstehen, was NumPy ist und warum es für wissenschaftliches Rechnen unerlässlich ist.

Was ist NumPy?

NumPy (kurz für Numerical Python) ist die grundlegende Bibliothek für wissenschaftliches Rechnen in Python. Sie bietet leistungsstarke Datenstrukturen und Funktionen für die Arbeit mit großen Arrays und Matrizen numerischer Daten.

Warum NumPy statt Python-Listen?

Während die integrierten Listen von Python flexibel und einfach zu verwenden sind, haben sie Einschränkungen bei der Arbeit mit numerischen Daten:

  • Leistung: NumPy-Arrays sind für mathematische Operationen wesentlich schneller.
  • Speichereffizienz: NumPy benötigt weniger Speicher, um die gleiche Datenmenge zu speichern.
  • Komfort: NumPy bietet Hunderte von integrierten mathematischen Funktionen.
  • Funktionalität: NumPy unterstützt fortgeschrittene Operationen wie Matrixmultiplikation, Fourier-Transformationen usw.

In diesem Lab lernen Sie die gängigsten Methoden zur Erstellung von NumPy-Arrays kennen. Sie werden Python-Skripte schreiben und ausführen, um die Konvertierung von Python-Sequenzen, die Verwendung integrierter NumPy-Funktionen, die Manipulation vorhandener Arrays und das Laden von Daten aus Dateien zu üben. Alle Programmierarbeiten werden innerhalb der WebIDE durchgeführt.

Erstellung von Arrays aus Python-Sequenzen

Der grundlegendste Weg, ein NumPy-Array zu erstellen, ist die Konvertierung einer Python-Sequenz wie einer Liste oder einem Tupel. Die Funktion numpy.array() nimmt eine Sequenz als Argument und gibt ein neues NumPy-Array zurück.

Verständnis von NumPy-Arrays

Bevor wir Arrays erstellen, wollen wir verstehen, was NumPy-Arrays besonders macht:

Array-Dimensionen

  • 1D-Array (Vektor): Eine einfache Liste von Zahlen, wie [1, 2, 3, 4]
  • 2D-Array (Matrix): Eine Tabelle von Zahlen mit Zeilen und Spalten, wie eine Tabellenkalkulation
  • 3D-Array (Tensor): Ein Würfel aus Zahlen, nützlich für Bilder oder 3D-Daten
Array-Dimensionen

Hauptunterschiede zu Python-Listen

  • Homogen: Alle Elemente müssen denselben Datentyp haben (normalerweise Zahlen)
  • Feste Größe: Nach der Erstellung kann die Größe nicht mehr geändert werden
  • Effizient: Viel schneller für mathematische Operationen
  • Umfangreiche Funktionalität: Unterstützt vektorisierte Operationen (Operationen auf ganzen Arrays gleichzeitig)

Importieren von NumPy

In Python importieren wir NumPy mit dem Standardalias np:

import numpy as np

Dieser np-Alias ist eine weit verbreitete Konvention in der wissenschaftlichen Python-Community.

Nun erstellen wir einige Arrays. Öffnen Sie die Datei array_from_sequence.py im Dateiexplorer auf der linken Seite. Fügen Sie den folgenden Code hinzu. Dieser Code importiert die NumPy-Bibliothek und erstellt eindimensionale (1D), zweidimensionale (2D) und dreidimensionale (3D) Arrays aus Python-Listen.

Python-Code zum Erstellen von NumPy-Arrays
import numpy as np

## Erstellen eines 1D-Arrays aus einer Liste
a1D = np.array([1, 2, 3, 4])
print("1D Array:")
print(a1D)

## Erstellen eines 2D-Arrays aus einer Liste von Listen
a2D = np.array([[1, 2], [3, 4]])
print("\n2D Array:")
print(a2D)

## Erstellen eines 3D-Arrays aus verschachtelten Listen
a3D = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("\n3D Array:")
print(a3D)

Vorschlag: Sie können den obigen Code in Ihren Code-Editor kopieren und dann jede Codezeile sorgfältig lesen, um ihre Funktion zu verstehen. Wenn Sie weitere Erklärungen benötigen, können Sie auf die Schaltfläche "Code erklären" 👆 klicken. Sie können mit Labby für personalisierte Hilfe interagieren.

Nachdem Sie den Code hinzugefügt haben, speichern Sie die Datei. Führen Sie nun das Skript im Terminal aus, um die Ausgabe zu sehen.

python array_from_sequence.py

Sie sollten die folgende Ausgabe sehen, die die von Ihnen erstellten Arrays anzeigt:

1D Array:
[1 2 3 4]

2D Array:
[[1 2]
 [3 4]]

3D Array:
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]

Verständnis von Datentypen (dtype)

NumPy-Arrays haben einen festen Datentyp für alle Elemente, der durch den Parameter dtype spezifiziert wird. Dies unterscheidet sich von Python-Listen, bei denen jedes Element einen anderen Typ haben kann.

Warum Datentypen wichtig sind

  • Speichereffizienz: Verschiedene Typen verbrauchen unterschiedliche Mengen an Speicher
  • Leistung: Operationen sind für bestimmte Datentypen optimiert
  • Präzision: Steuert, wie Zahlen gespeichert und berechnet werden

Gängige Datentypen

  • int32 / int64: Ganzzahlen (32 oder 64 Bit)
  • float32 / float64: Dezimalzahlen (32 oder 64 Bit)
  • complex: Komplexe Zahlen
  • bool: Wahr/Falsch-Werte

Sie können den Datentyp beim Erstellen eines Arrays mit dem Parameter dtype angeben, z. B. np.array([1, 2], dtype=complex). Wenn Sie keinen dtype angeben, wählt NumPy automatisch einen geeigneten basierend auf den Eingabedaten aus.

Verwendung intrinsischer Array-Erstellungsfunktionen

NumPy bietet mehrere integrierte Funktionen zur Erstellung von Arrays von Grund auf, ohne dass eine Python-Sequenz erforderlich ist. Diese Funktionen sind für spezifische Anwendungsfälle optimiert und wesentlich schneller als die manuelle Erstellung von Arrays aus Listen.

Warum diese Funktionen verwenden?

Anstatt np.array([0, 0, 0, 0, 0]) zu schreiben, können Sie einfach np.zeros(5) verwenden. Diese Funktionen sind:

  • Schneller: Optimierter C-Code im Hintergrund.
  • Lesbarer: Die Absicht ist aus dem Funktionsnamen klar ersichtlich.
  • Speichereffizient: Direkte Speicherzuweisung.
  • Bequem: Keine manuelle Angabe jedes Elements erforderlich.

Öffnen Sie die Datei intrinsic_creation.py und fügen Sie den folgenden Code hinzu. Dieses Skript demonstriert mehrere gängige Erstellungsfunktionen.

import numpy as np

## Erstellen eines Arrays mit einem Bereich von Elementen
## np.arange(start, stop, step) - ähnlich wie range() in Python
## Anwendungsfall: Erstellen von Sequenzen für Schleifen, Generieren von Indizes
arr_range = np.arange(0, 10, 2)  ## [0, 2, 4, 6, 8]
print("Array von arange:")
print(arr_range)

## Erstellen eines Arrays mit einer bestimmten Anzahl von Elementen zwischen zwei Punkten
## np.linspace(start, stop, num_elements) - gleichmäßig verteilte Punkte
## Anwendungsfall: Erstellen von Punkten für Diagramme, Stichproben von Daten
arr_linspace = np.linspace(0, 10, 5)  ## 5 Punkte von 0 bis 10
print("\nArray von linspace:")
print(arr_linspace)

## Erstellen eines Arrays, das mit Nullen gefüllt ist
## np.zeros((rows, columns)) - Initialisieren von Arrays für Berechnungen
## Anwendungsfall: Vorab-Reservierung von Arrays, bevor sie mit berechneten Werten gefüllt werden
arr_zeros = np.zeros((2, 3))  ## 2x3 Array mit Nullen
print("\nArray mit Nullen:")
print(arr_zeros)

## Erstellen eines Arrays, das mit Einsen gefüllt ist
## np.ones((rows, columns)) - Initialisieren mit Einsen
## Anwendungsfall: Erstellen von Masken, Skalierungsfaktoren oder Startpunkten für Algorithmen
arr_ones = np.ones((3, 2))  ## 3x2 Array mit Einsen
print("\nArray mit Einsen:")
print(arr_ones)

## Erstellen einer Identitätsmatrix
## np.eye(size) - quadratische Matrix mit Einsen auf der Diagonalen, sonst Nullen
## Anwendungsfall: Lineare Algebra, Zurücksetzen von Transformationen, Matrixmultiplikation
identity_matrix = np.eye(3)  ## 3x3 Identitätsmatrix
print("\nIdentitätsmatrix:")
print(identity_matrix)

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

python intrinsic_creation.py

Die Ausgabe zeigt die verschiedenen von diesen Funktionen erstellten Arrays:

Array from arange:
[0 2 4 6 8]

Array from linspace:
[ 0.   2.5  5.   7.5 10. ]

Array of zeros:
[[0. 0. 0.]
 [0. 0. 0.]]

Array of ones:
[[1. 1.]
 [1. 1.]
 [1. 1.]]

Identity matrix:
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

Bearbeiten vorhandener Arrays

Sie können auch neue Arrays erstellen, indem Sie bestehende modifizieren, kombinieren oder aufteilen. Dieser Abschnitt behandelt zwei wichtige Konzepte: Views vs. Kopien und Array-Verkettung.

Views vs. Kopien: Verständnis der Speicherfreigabe

Dies ist eines der wichtigsten Konzepte in NumPy, das Anfänger oft verwirrt.

Was ist eine View?

Eine View ist eine andere Art, auf dieselben Daten im Speicher zuzugreifen. Wenn Sie eine View erstellen (z. B. durch Slicing), erstellen Sie kein neues Array – Sie erstellen lediglich eine neue Referenz auf die vorhandenen Daten.

Was ist eine Kopie?

Eine Kopie erstellt ein komplett neues Array im Speicher mit eigenen Daten. Änderungen an einer Kopie beeinflussen das Original-Array nicht und umgekehrt.

Warum das wichtig ist

  • Views sind speichereffizient: Sie duplizieren keine Daten.
  • Views sind schnell: Kein Kopieraufwand.
  • Aber Views können unerwartete Nebeneffekte verursachen: Das Modifizieren einer View ändert die Originaldaten.
  • Kopien sind sicherer: Änderungen sind isoliert, verbrauchen aber mehr Speicher.

Lassen Sie uns auch untersuchen, wie mehrere Arrays zu einem größeren Array zusammengefügt werden.

Öffnen Sie die Datei array_manipulation.py und fügen Sie den folgenden Code hinzu:

import numpy as np

## --- Teil 1: Views vs. Kopien ---
a = np.arange(1, 5)
print("Original-Array 'a':", a)

## Erstellen einer View der ersten beiden Elemente
b = a[:2]
b[0] = 99 ## Modifizieren der View
print("Modifizierte View 'b':", b)
print("Array 'a' nach Modifizierung der View:", a) ## 'a' wird ebenfalls geändert

## Erstellen einer Kopie
c = a[:2].copy()
c[0] = 0 ## Modifizieren der Kopie
print("\nModifizierte Kopie 'c':", c)
print("Array 'a' nach Modifizierung der Kopie:", a) ## 'a' bleibt unverändert

## --- Teil 2: Arrays verknüpfen ---
A = np.ones((2, 2))
B = np.eye(2) * 2
C = np.zeros((2, 2))
D = np.diag((-3, -4))

## Arrays zu einer Blockmatrix verknüpfen
block_matrix = np.block([
    [A, B],
    [C, D]
])
print("\nBlockmatrix:")
print(block_matrix)

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

python array_manipulation.py

Die Ausgabe zeigt, wie die Modifizierung einer View das Original-Array beeinflusst, während die Modifizierung einer Kopie dies nicht tut. Sie zeigt auch das Ergebnis der Kombination von vier kleineren Arrays zu einer einzigen Blockmatrix.

Original array 'a': [1 2 3 4]
Modified view 'b': [99  2]
Array 'a' after modifying the view: [99  2  3  4]

Modified copy 'c': [0 2]
Array 'a' after modifying the copy: [99  2  3  4]

Block matrix:
[[ 1.  1.  2.  0.]
 [ 1.  1.  0.  2.]
 [ 0.  0. -3.  0.]
 [ 0.  0.  0. -4.]]

Arrays aus einer Datei lesen

Eine häufige Aufgabe in der Datenanalyse ist das Laden von Daten aus einer Datei in ein NumPy-Array. NumPy ist hierfür hervorragend geeignet, da es große Datensätze effizient lesen und automatisch in die entsprechenden numerischen Formate konvertieren kann.

Warum NumPy für Datei-I/O?

  • Geschwindigkeit: Deutlich schneller als zeilenweises Lesen mit Python
  • Typinferenz: Erkennt automatisch geeignete Datentypen
  • Speichereffizienz: Lädt Daten direkt in optimierte Arrays
  • Komfort: Ein einziger Funktionsaufruf anstelle komplexer Parsing-Schritte

Gängige Dateiformate

  • CSV-Dateien: Komma-separierte Werte (am gebräuchlichsten)
  • TSV-Dateien: Tabulator-separierte Werte
  • Textdateien: Mit Leerzeichen oder benutzerdefinierten Trennzeichen separiert
  • Binärdateien: Für sehr große Datensätze (fortgeschritten)

Für einfache Textdateien wie CSV (Comma-Separated Values) bietet NumPy die Funktion np.loadtxt().

Das Setup-Skript für dieses Lab hat bereits eine Datei namens data.csv in Ihrem Projektverzeichnis erstellt. Ihr Inhalt ist:

col1,col2,col3
1.0,2.5,3.2
4.5,5.0,6.8
7.3,8.1,9.9

Öffnen Sie nun die Datei read_from_file.py und fügen Sie den folgenden Code hinzu, um diese Daten zu lesen.

Verständnis der np.loadtxt-Parameter

Die Funktion np.loadtxt() hat mehrere wichtige Parameter:

  • delimiter=',': Gibt an, wie Spalten getrennt sind (Komma für CSV)
  • skiprows=1: Überspringt die erste Zeile (normalerweise Header)
  • dtype: Optional – gibt den Datentyp an (automatisch erkannt, wenn nicht angegeben)
  • usecols: Optional – gibt an, welche Spalten gelesen werden sollen
  • comments: Optional – gibt das Kommentarzeichen an, um Zeilen zu ignorieren

Wir verwenden delimiter=',', um anzugeben, dass die Spalten durch Kommas getrennt sind, und skiprows=1, um die Header-Zeile zu ignorieren.

import numpy as np

## Daten aus der CSV-Datei laden
try:
    ## Relative Pfade führen zu Validierungsfehlern, bitte absolute Pfade im Lab verwenden
    data = np.loadtxt('/home/labex/project/data.csv', delimiter=',', skiprows=1)
    print("Daten aus data.csv geladen:")
    print(data)
except IOError:
    print("Fehler: data.csv nicht gefunden.")

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

python read_from_file.py

Das Skript liest die numerischen Daten aus data.csv und gibt sie als NumPy-Array aus.

Daten aus data.csv geladen:
[[1.  2.5 3.2]
 [4.5 5.  6.8]
 [7.3 8.1 9.9]]

Diese Methode ist sehr effizient zum Laden strukturierter numerischer Daten in Arrays für die weitere Verarbeitung.

Zusammenfassung

In diesem Lab haben Sie die grundlegenden Techniken zur Erstellung von NumPy-Arrays kennengelernt. Sie haben das Erstellen von Arrays aus Python-Listen geübt, intrinsische Funktionen wie np.arange und np.zeros verwendet, bestehende Arrays durch Views, Kopien und Verknüpfungen manipuliert und Daten aus einer Textdatei mit np.loadtxt geladen.

Diese Fähigkeiten sind die Bausteine für nahezu alle numerischen und wissenschaftlichen Berechnungsaufgaben, die Sie mit Python durchführen werden. Mit einem soliden Verständnis der Array-Erstellung sind Sie nun bereit, fortgeschrittenere Array-Manipulationen und mathematische Operationen in NumPy zu erkunden.