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.

Hide 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.

../../../_images/array_single_value.jpeg

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 

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 

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.

../../../_images/array_last_element.jpeg

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 

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 

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}\).

../../../_images/array_row_col.jpeg

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 

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.

../../../_images/array_indexrange.jpeg

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

Aufgabe 2.3

Erstellen Sie die Variable \(\texttt{blutwerte}\), die die letzten beiden Spalten von \(\texttt{data}\) enthält.

# Ihr Code 

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.

../../../_images/array_from_index_to_end.jpeg

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 

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\).

../../../_images/array_modify.jpeg

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).

../../../_images/vector_nan.jpg

Aufgabe 3.1

Ändern Sie das dritte Element von \(\texttt{alter}\) von \(\texttt{nan}\) zu \(72\).

# Ihr Code 

Python erlaubt es außerdem auch direkt mehrere Werte auf einmal zu ändern, genauso wie es möglich ist mehrere Werte auf einmal auszulesen.

../../../_images/array_modify2.jpeg

Ähnlich wie eine Lücke in den Altersdaten der Patienten, ist auch eine Lücke bei den Blutzuckerwerten zu verzeichnen.

../../../_images/matrix_nan.jpg

Aufgabe 3.2

Erstellen Sie das Array \(\texttt{testgruppe_a_werte}\) mit den Einträgen

\[ \begin{pmatrix} 87 & 69 & 85 & 89 & 80 & 68 & 82 \end{pmatrix}. \]
# Ihr Code 

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