Indizierung von Arrays#
Da Arrays für die Programmierung numerischer Algorithmen fundamental sind, ist es wichtig, vertraut im Umgang mit ihnen zu sein. Der erste Schritt ist das Zugreifen oder Verweisen auf Elemente eines Arrays, auch Indizierung genannt. Die Indizierung erlaubt es, Elemente eines Arrays auszulesen oder zu verändern. Die Position eines Wertes innerhalb eines Arrays nennt man Index. In Python beginnt die Indizierung bei \(0\), das bedeutet das erste Element hat den Index \(0\), das zweite den Index \(1\), das dritte den Index \(2\) und so weiter.
In diesem Unterkapitel werden Sie mit dem eindimensionalen Array \(\texttt{alter}\) und zweidimensionalem Array \(\texttt{data}\) arbeiten. Der folgende, versteckte Code initialisiert sowohl \(\texttt{alter}\) als auch \(\texttt{data}\) automatisch sobald Sie den Live-Code-Modus starten.
Show code cell content
import numpy as np
import pandas as pd
url = "https://www4.stat.ncsu.edu/~boos/var.select/diabetes.tab.txt"
diabetes_data_raw = pd.read_csv(url, sep="\t", skiprows=0, header=0, engine="python")
diabetes_data_raw.columns = diabetes_data_raw.columns.str.strip()
data = diabetes_data_raw.to_numpy()[0:15, [0,2,3,7,9]]
data[:7, -1] = np.nan
alter = data[:, 0]
alter[2] = np.nan
In \(\texttt{data}\) sind Daten von 15 verschiedenen Diabetespatientinnen hinterlegt. Eine Zeile entspricht einem oder einer Patienten/in und eine Spalte den verschiedene Daten, die erhoben worden sind. Es stehen folgende Daten zur Verfügung:
Spalte 0 |
Alter in Jahren |
Spalte 1 |
Body Mass Index (BMI) |
Spalte 2 |
Blutdruck |
Spalte 3 |
Cholesterinwerte |
Spalte 4 |
Blutzuckerwerte |
In \(\texttt{alter}\) ist das Alter der Patientinnen in Jahren hinterlegt.
Einzelne Arrayelemte extrahieren#
Um ein einzelnes Element eines eindimensionalen Arrays \(\texttt{x}\) auszulesen (zu vergleichen mit einem Vektor), nutzt man die Syntax \(\texttt{x[idx]}\). Möchte man beispielsweise das dritte Element von \(\texttt{x}\) auslesen, so ist dies mit \(\texttt{x[2]}\) möglich.
Um Elemente aus einem zweidimensional Array \(\texttt{A}\) auszulesen (zu vergleichen mit einer Matrix), benötigen man zwei Indizes. Der erste gibt die Zeile, der zweite die Spalte an: \(\texttt{A[zeile, spalte]}\). Beispielsweise gibt \(\texttt{A[0, 2]}\) den Wert in der ersten Zeile und der dritten Spalte zurück.
Aufgabe 1.1
Speichern Sie das Alter von Patientin 4, also das vierte Element des Arrays \(\texttt{alter}\), in einer Variable \(\texttt{patient_a}\).
# Ihr Code
Hinweis
Beachten Sie, dass in Python die Indizierung bei \(0\) beginnt. Verwenden Sie \([]\) zur Indizierung in \(\texttt{alter}\).
Lösung
patient_a = alter[3]
Aufgabe 1.2
Speichern Sie ebenfalls den BMI von Patientin 4 also das Element in der vierten Zeile und zweiten Spalte des Arrays \(\texttt{data}\) in einer Variablen \(\texttt{patient4_bmi}\).
# Ihr Code
Hinweis
Beachten Sie, dass in Python die Indizierung bei \(0\) beginnt. Verwenden Sie \(1\) und \(3\) zur Indizierung in \(\texttt{data}\).
Lösung
patient4_bmi = data[3, 1]
Python ermöglicht es Ihnen \(-1\) als Index bei Arrays zu verwenden, um auf das letzte Element zuzugreifen. Möchten Sie zum Beispiel auf das letzte Elemente des eindimensionalen Arrays \(\texttt{x}\) zugreifen, geht dies mit der Syntax \(\texttt{x[-1]}\). Bei zweidimensionalen Arrays müssen Sie zudem einen zweiten Index angeben. So gibt \(\texttt{A[-1, 3]}\) beispielsweise den Eintrag in der letzten Zeile und 4. Spalte zurück.
Die Verwendung des Index \(-1\), um auf das letzte Element zuzugreifen, ist Teil der allgemeinen Indexierungslogik in Python, bei der negative Indizes verwendet werden, um Elemente von hinten aus zu zählen. Das bedeutet:
Positive Indizes beginnen am Anfang des Arrays und zählen nach rechts: \(0, 1, 2,\ldots\)
Negative Indizes beginnen am Ende des Arrays und zählen nach links: \(-1, -2, -3,\ldots\)
Aufgabe 1.3
Extrahieren Sie den Wert in der 8. Zeile und der letzten Spalte von \(\texttt{data}\), indem Sie die Syntax \(-1\) verwenden. Weisen Sie anschließend diesen Wert einer Variablen mit dem Namen \(\texttt{patient8_blutzucker}\) zu.
# Ihr Code
Lösung
patient8_blutzucker = data[7, -1]
Aufgabe 1.4
Erstellen Sie eine Variable \(\texttt{patient_b_alter}\), die das Alter der vorletzten Patentin, also das vorletzte Element von \(\texttt{alter}\) enthält. Nutzen Sie negative Indizes!
# Ihr Code
Lösung
patient_b_alter = alter[-2]
Mehre Arrayelemente extrahieren#
Oft benötigt man eine ganze Zeile oder eine ganze Spalte eines zweidimensionales Arrays \(\texttt{A}\). In diesem Fall kann der Doppelpunkt-Operator \(\texttt{:}\) als Index verwenden, was Python als “alle Zeilen” oder “alle Spalten” interpretiert. Zum Beispiel liefert \(\texttt{A[0, :]}\) die erste Zeile von \(\texttt{A}\) und \(\texttt{A[:, 1]}\) die zweite Spalte von \(\texttt{A}\).
Aufgabe 2.1
Erstellen Sie einen Spaltenvektor mit dem Namen \(\texttt{blutdruck}\), der alle Elemente aus der 3. Spalte des Arrays \(\texttt{data}\) enthält.
# Ihr Code
Hinweis
Verwenden Sie den Operator \(\texttt{:}\) als ersten Index. Mit diesem Operator werden alle Zeilen extrahiert. Verwenden Sie \(2\) als zweiten Index. Dieser Index gibt die dritte Spalte an.
Lösung
blutdruck = data[:, 2]
Sie können den Doppelpunkt-Operator ebenfalls verwenden, um einen Wertebereich anzugeben und so mehrere aufeinanderfolgende Elemente auszulesen. Der Code \(\texttt{x[1:4]}\) extrahiert das zweite, dritte und vierte Element des Arrays \(\texttt{x}\). Der fünfte Wert \(\texttt{x[4]}\) wird dabei nicht mit ausgelesen. Die Syntax \(\texttt{start:end}\) ist also als das halboffenes Intervall \([\texttt{start}, \texttt{end})\) zu verstehen.
Genauso liefert \(\texttt{A[0:3, 2]}\) das erste, zweite und dritte Element der dritten Spalte von \(\texttt{A}\).
Aufgabe 2.2
Extrahieren Sie aus dem eindimensionalen Array \(\texttt{alter}\) das Alter der Patienten, welche zu den Indices 5 bis 12 korresponsieren und speichern Sie das Ergebnis in der Variable \(\texttt{teilgruppe_alter}\).
# Ihr Code
Lösung
teilgruppe_alter = alter[5:13]
Aufgabe 2.3
Erstellen Sie die Variable \(\texttt{blutwerte}\), die die letzten beiden Spalten von \(\texttt{data}\) enthält.
# Ihr Code
Lösung
blutwerte = data[:, 3:5]
Python stellt außderdem eine komfortable Methode zur Verfügung, um alle Elemente ausgehend von einem Startindex zu extrahieren. Das Beispiel \(\texttt{x[3:]}\) gibt die Teilmenge der Elemente von \(\texttt{x}\) beginnend beim Index \(3\) bis zum Ende des Vektors zurück.
Umgekehrt gibt der Code \(\texttt{x[:4]}\) die Teilmenge der Elemente von \(\texttt{x}\) beginned bei Index \(0\) bis einschließlich Index \(3\). Das Ende des Wertebereichs ist also wieder als offene Intervallgrenze zu verstehen.
Zusammen mit einem weiteren Index funktioniert diese Syntax auch für zweidimensionale Array vollkommen analog.
Aufgabe 2.4
Erstellen Sie eine Array mit dem Namen \(\texttt{testgruppe_a}\), welches alle Daten der ersten sieben Patientinnen, sprich die ersten 7 Zeilen, und allen Spalten des Arrays \(\texttt{data}\) enthält.
# Ihr Code
Lösung
testgruppe_a = data[:7, :]
# alternativ bzw. äquivalent
testgruppe_a = data[0:7, :]
Zusatzaufgabe
Bei Indizes kann es sich auch um nicht aufeinanderfolgende Zahlen handeln. Beispielsweise können Sie zum Extrahieren der ersten, dritten und sechsten Elemente von \(\texttt{alter}\) den Index \(\texttt{[0, 3, 5]}\) verwenden.
Aber Achtung: Hier ist es wichtig, dass Sie die eckigen Klammern um die Indizes \(0, 3, 5\) beim Einsetzen nicht vergessen!
# Ihr Code
Zusammenfassung
In Python beginnt die Indizierung bei \(0\) anstatt bei \(1\). Bei Angabe von Indexbereichen mittels \(\texttt{:}\) ist die rechte Intervalgrenze offen, das heißt \(\texttt{i:j}\) umfasst die Indizes \(\texttt{[i, j)}\).
einzelnes Element |
\(\texttt{x[idx]}\) oder \(\texttt{A[zeile, spalte]}\) |
letztes Element |
\(\{\texttt{idx}, \texttt{zeile}, \texttt{spalte}\} = -1\) |
alle Zeilen bzw. Spalten |
\(\texttt{A[:, spalte]}\) bzw. \(\texttt{A[zeile, :]}\) |
alle Werte ab Index \(i\) |
\(\texttt{i:}\) |
alle Werte bis Index \(i\) |
\(\texttt{:(i+1)}\) |
alle Werte zwischen Index \(\texttt{i}\) und \(\texttt{j}\) |
\(\texttt{i:(j+1)}\) |
Arraywerte modifizieren#
Zum Modifizieren von Arrayelementen kann die gleiche Syntax verwendet werden wie beim Elemente auslesen. Zum Beispiel ändert \(\texttt{x[2] = -2}\) das dritte Element des eindimensionalen Array \(\texttt{x}\) von \(0\) zu \(-2\). Für zweidimensionale Arrays ist das Vorgehen analog. Das Beispiel \(\texttt{A[2, 3] = 42}\) ändert das Element in der 3. Zeile und 4. Spalte von \(7\) zu \(42\).
Leider ist beim Eintragen der Patientinnendaten ein Fehler unterlaufen, sodass das Alter von Patentinn \(3\) nicht eingetragen wurde (gekennzeichent durch nan, engl. Not a Number).
Aufgabe 3.1
Ändern Sie das dritte Element von \(\texttt{alter}\) von \(\texttt{nan}\) zu \(72\).
# Ihr Code
Lösung
alter[2] = 72
Python erlaubt es außerdem auch direkt mehrere Werte auf einmal zu ändern, genauso wie es möglich ist mehrere Werte auf einmal auszulesen.
Ähnlich wie eine Lücke in den Altersdaten der Patienten, ist auch eine Lücke bei den Blutzuckerwerten zu verzeichnen.
Aufgabe 3.2
Erstellen Sie das Array \(\texttt{testgruppe_a_werte}\) mit den Einträgen
# Ihr Code
Lösung
testgruppe_a_werte = np.array([87, 69, 85, 89, 80, 68, 82])
Aufgabe 3.3
Tragen Sie die Blutzuckerwerte der Testgruppe A nach, indem Sie den ersten \(7\) Einträge der letzen Spalten des Arrays \(\texttt{data}\) das Array \(\texttt{testgruppe_a_werte}\) zu weisen.
# Ihr Code
Hinweis
Greifen Sie zuerst auf die Einträge in der letzten Spalte und den ersten sieben Zeilen in \(\texttt{data}\) zu. Nutzen Sie anschließen den Zuweisungsoperator \(\texttt{=}\) zusammen mit \(\texttt{testgruppe_a_werte}\).
Lösung
data[:7, -1] = testgruppe_a_werte
# alternativ
data[0:7, -1] = testgruppe_a_werte