Arrays zusammenfügen#

Der Lehrstuhl für wissenschaftliches Rechnen der Universität Mannheim hat sich zu Beginn des Jahres 2025 zum Ziel gesetzt die Anzahl an NextBike Ausleihen zu analysieren. Dazu wurden vom 06.01. bis zum 19.01.2025 alle Ausleihen von der NextBike Station am Hauptbahnhof gezählt. Um das Arbeitszeitgesetz nicht zu verletzen, wurde die Zählung in drei Schichten unterteilt. Die erste Schicht beinhaltet den Zeitraum 00:00 Uhr bis 11:59 Uhr werktags. Die Daten der ersten Schicht für Woche 1 (06.01-10.01) sind in der Matrix \(\texttt{W1_vormittag}\) gespeichert:

\[ \texttt{W1_vormittag} = \begin{pmatrix} 32 & 47 & 42 & 42 & 22 \end{pmatrix}. \]

Dabei steht der erste Eintrag für Montag, der zweite für Dienstag, der dritte für Mittwoch, usw. Die Daten für Woche 2 (13.01-17.01) sind gegeben:

\[ \texttt{W2_vormittag} = \begin{pmatrix} 35 & 52 & 37 & 50 & 27 \end{pmatrix}. \]

Analog hat die zweite Schicht (12:00 Uhr bis 23.59 Uhr werktags) ihre Daten gespeichert:

\[\begin{split}\begin{align} \texttt{W1_nachmittag} & = \begin{pmatrix} 50 & 36 & 18 & 39 & 50 \end{pmatrix}, \\ \texttt{W2_nachmittag} & = \begin{pmatrix} 58 & 55 & 58 & 60 & 55 \end{pmatrix}. \end{align}\end{split}\]

In der letzten Schicht wurden die Wochenenden gezählt. Die erste Woche lieferte \(\texttt{W1_wochenende}\) und die zweite \(\texttt{W2_wochenende}\) mit den Daten:

\[\begin{split}\begin{align} \texttt{W1_wochenende} & =\begin{pmatrix} 21 & 14\\ 37 & 76 \end{pmatrix}, \\ \texttt{W2_wochenende} & = \begin{pmatrix} 26 & 19\\ 60 & 63 \end{pmatrix}. \end{align}\end{split}\]

Die erste Zeile zeigt jeweils die Ausleihen am Vormittag und die zweite Zeile die am Nachmittag an. Die erste Spalte repräsentiert Samstag und die zweite Spalte Sonntag.

Das Ziel dieses Kapitels ist es, die in den einzelnen Schichten erhobenen Daten je Woche in einer Matrix zusammenzuführen:

\[\begin{split} \begin{pmatrix} & \text{Mo} & \text{Di} & \text{Mi} & \text{Do} & \text{Fr} & \text{Sa} & \text{So}\\ \text{Vormittag} & 32 & 47 & 42 & 42 & 22 & 21 & 14\\ \text{Nachmittag} & 50 & 36 & 18 & 39 & 50 & 37 & 76\\ \end{pmatrix}. \end{split}\]

Existierende Arrays kombinieren#

Es gibt zwei Möglichkeiten Matrizen zusammenzufügen: vertikal und horizonttal. Dieses Zusammenfügen nennt man in beiden Fällen auch konkatenieren oder Konkatenation.

Das vertikale Zusammenfügen funktioniert über den Befehl \(\texttt{np.vstack((a,b))}\), wobei in diesem Fall die Matrix \(\texttt{b}\) unten an die Matrix \(\texttt{a}\) gehängt wird.

../../../_images/hstack_vstack.png
import numpy as np

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
a_über_b = np.vstack((a, b))

print(a_über_b)

Achtung

Beachten Sie, dass sie mit \(\texttt{np.vstack}\) nur zwei Matrizen mit der gleichen Anzahl an Spalten zusammenfügen können.

Aufgabe 1.1

Fügen Sie \(\texttt{W1_vormittag}\) und \(\texttt{W1_nachmittag}\) zu der Matrix \(\texttt{W1_werktags}\) zusammen, so dass in der ersten Zeile die Ausleihen von vormittag stehen und in der Zweiten die vom Nachmittag.

W1_vormittag = np.array([[32, 47, 42, 42, 22]])
W1_nachmittag = np.array([[50, 36, 18, 39, 50]])

# Ihr Code 

Mit dem Befehl \(\texttt{np.hstack((a,c))}\) fügt man zwei Matrizen horizontal zusammen. Wie im Bild gezeigt, wird die Matrix \(\texttt{c}\) rechts an die Matrix \(\texttt{a}\) gehängt.

a = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])
c = np.array([[1, 2],[3, 4],[5, 6]])
a_links_c = np.hstack((a,c))

print(a_links_c)

Achtung

Beachten Sie, dass sie mit \(\texttt{np.hstack}\) nur zwei Matrizen mit der gleichen Anzahl an Zeilen zusammenfügen können.

Aufgabe 1.2

Fügen Sie \(\texttt{W1_werktags}\) und \(\texttt{W1_wochenende}\) zu der Matrix \(\texttt{W1}\) zusammen, so dass die ersten \(5\) Spalten die Werktage beschreiben und die letzten beiden das Wochenende.

W1_wochenende = np.array([[21, 14],[37, 76]])
# Ihr Code 

Achtung

Wird \(\texttt{np.hstack}\) oder \(\texttt{np.vstack}\) mit einem eindimensionalen Array (Form \((n,)\)) aufgerufen, interpretiert NumPy dieses je nach Funktion automatisch:

  • Bei \(\texttt{np.hstack}\) als Zeilenvektor \((1, n)\)

  • Bei \(\texttt{np.vstack}\) als Spaltenvektor \((n, 1)\)

Das klappt nur, wenn die Dimensionen genau passen, kann aber leicht zu Verwirrung führen. 👉 Daher besser direkt mit zweidimensionalen Arrays arbeiten.

Alternativ zu \(\texttt{np.vstack}\) und \(\texttt{np.hstack}\) kann man auch die Funktion \(\texttt{np.concatenate}\) verwenden. Folgenden Funktionsaufrufe sind dabei äquivalent:

\[\begin{split}\begin{align} \texttt{np.vstack((a,b))} & = \texttt{np.concatenate((a,b), axis=0)} \\ \texttt{np.hstack((a,c))} & = \texttt{np.concatenate((a,c), axis=1)}. \end{align}\end{split}\]

Der zusätzliche Eingabeparameter \(\texttt{axis}\) gibt an, ob man die Matrizen vertikal (\(\texttt{axis=0}\)) oder horizontal (\(\texttt{axis=1}\)) zusammenfügen möchte.

a = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])
b = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
c = np.array([[1, 2],[3, 4],[5, 6]])
a_über_b = np.concatenate((a, b), axis=0)
a_links_c = np.concatenate((a, c), axis=1)

print(a_über_b)
print(a_links_c)

Fügen Sie zu \(\texttt{W1}\) eine Zeile hinzu, sodass die Matrix die folgende Form hat:

\[\begin{split} \begin{pmatrix} \text{Mo} & \text{Di} & \text{Mi} & \text{Do} & \text{Fr} & \text{Sa} & \text{So}\\ 32 & 47 & 42 & 42 & 22 & 21 & 14\\ 50 & 36 & 18 & 39 & 50 & 37 & 76\\ \end{pmatrix} \end{split}\]

Fügen Sie zu \(\texttt{W1}\) noch eine Spalte hinzu, sodass die Matrix folgende Form hat:

\[\begin{split} \begin{pmatrix} \ & \text{Mo} & \text{Di} & \text{Mi} & \text{Do} & \text{Fr} & \text{Sa} & \text{So}\\ \text{Vormittag} & 32 & 47 & 42 & 42 & 22 & 21 & 14\\ \text{Nachmittag} & 50 & 36 & 18 & 39 & 50 & 37 & 76\\ \end{pmatrix}. \end{split}\]
# Ihr Code 

Aufgabe 1.5

Fügen Sie nur die Daten für Woche 2 analog in einer Matrix \(\texttt{W2}\) zusammen. Verwenden Sie dafür nur eine Zuweisungsoperation. Da Ergebnis soll wie folgt aussehen:

\[\begin{split} \begin{pmatrix} & \text{Mo} & \text{Di} & \text{Mi} & \text{Do} & \text{Fr} & \text{Sa} & \text{So}\\ \text{Vormittag} & 35 & 52 & 37 & 50 & 27 & 26 & 19\\ \text{Nachmittag} & 58 & 55 & 58 & 60 & 55 & 60 & 63\\ \end{pmatrix}. \end{split}\]
# benötigte Vektoren und Matrizen mit den Daten
W2_vormittag = np.array([[35, 52, 37, 50, 27]])
W2_nachmittag = np.array([[58, 55, 58, 60, 55]])
W2_wochenende = np.array([[26, 19], [60, 63]])
wochentage = np.array([["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]])
zeiten = np.array([[""], ["Vormittag"], ["Nachmittag"]])

# Ihr Code

Achtung

Bei \(\texttt{np.concatenate}\) müssen alle Arrays die gleiche Anzahl an Dimensionen haben. Zwei eindimensionale Arrays der Form (Form \((n,)\)) lassen sich nur entlang einer einzigen Achse zusammenhängen, nämlich \(\texttt{axis=0}\). Andere Achsen sind hier nicht erlaubt. Ein eindimensionales Array (Form \((n,)\)) und ein zweidimensionales Array (Form \( (m, n)\)) können dagegen nicht direkt kombiniert werden.

Arrays mittels Zusammenfügen erstellen#

Wenn Matrizen gewisse Regelmäßigkeiten in ihren Zeilen oder Spalten aufweisen, kann man die sie effizient über Vektoren erzeugen.

Gegeben seien die beiden zweidimensionalen Arrays

\[\begin{split} s=\begin{pmatrix} 99 \end{pmatrix},\ v = \begin{pmatrix} 1\\ 2\\ 3 \end{pmatrix}. \end{split}\]

Nutzen Sie den Vektor \(v\), um die folgende Matrix \(M\) zu erzeugen:

\[\begin{split} M = \begin{pmatrix} 1 & 1 & 1\\ 2 & 2 & 2\\ 3 & 3 & 3\\ \end{pmatrix}. \end{split}\]

Erstellen Sie die Matrix \(\texttt{CM}\) der Form:

\[\begin{split} \begin{pmatrix} M & v\\ v^T & s \end{pmatrix}. \end{split}\]

Erstellen Sie die Matrix \(\texttt{CM2}\):

\[\begin{split} \begin{pmatrix} M & s\\ v^T & v \end{pmatrix} \end{split}\]

Gibt es weitere Möglichkeiten, um \(M\), \(v\) und \(s\) zu kombinieren?

s = np.array([[99]])
v = np.array([[1],[2],[3]])

# Ihr Code