Matrizen#
(Klicken Sie hier für die englische Version dieser Seite)
Bei Matrizen handelt es sich um mehrdimensionale Vektoren. Beziehungsweise im Kontext von Python um mehrdimensionale Listen.
Wenn man mit mehrdimensionalen Daten arbeitet, dann reichen normale mehrdimensionale Listen oft nicht aus. Dafür werden dann oft sehr bekannte externe Bibliotheken benutzt, wie etwa numpy oder pandas.
Wie auch zu Beginn der Einführung gesagt, ist diese Einführung nicht dazu da, gute Software in Python zu schreiben, sondern grundlegende Konzepte zu verstehen. Daher wird in dieser Einführung ohne externe Bibliotheken, sondern nur mit normalen mehrdimensionalen Listen, gearbeitet.
Was sind mehrdimensionale Listen in Python#
Mehrdimensionale Listen sind in Python relativ einfach. Da man Listen schachteln kann, ist eine zweidimensionale Liste einfach eine Liste von Listen. Eine dreidimensionale Liste wäre eine Liste von Listen von Listen und so weiter. Für diese Einführung werden nur zweidimensionale Listen behandelt, da diese mit Abstand am häufigsten bei Algorithmen vorkommen und das Konzept für mehrdimensionale Listen ähnlich ist.
Erstellen einer zweidimensionalen Liste#
Um eine leere zweidimensionale Liste zu erstellen, kann man einfach eine leere Liste definieren und dann Listen darin hinzufügen.
matrix = []
matrix.append( [1, 2, 3] )
matrix.append( [4, 5, 6] )
print(matrix)
# --> [[1, 2, 3],
# [4, 5, 6]]
Wenn man eine zweidimensionale Liste erstellen möchte, kann man das auch eleganter mit List Comprehension machen. List Comprehension wird in dieser Einführung nicht behandelt. Interessierte, können bei bedarf zu dem Begriff recherchieren.
Zugriff#
Für den Zugriff auf zweidimensionale Listen, können zwei Indizierungen hintereinander benutzt werden.
a = [
[1,2,3],
[4,5,6],
[7,8,9]
]
print( a[0][0] )
# --> 1
Der erste Index ist der Index der Zeile und der zweite Index ist der Index der Spalte. Man kann es sich so erklären, dass der erste Index bestimmt, welche Unterliste gemeint ist. Der zweite Index bestimmt welches Element aus der Unterliste gemeint ist.
a = [
[1,2,3],
[4,5,6],
[7,8,9]
]
# Ganze Matrix
print( a )
# --> [[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]]
# Zeile Index 1
print( a[1] )
# --> [4, 5, 6]
# Zeile Index 1 Spalte Index 2
print( a[1][2] )
# --> 6
# Was ist mit Spalte Index 2?
# Nicht so einfach möglich.
# Entweder manuelle Iteration
# oder geschachtelte
# List Comprehension (hier nicht erklärt) nötig
print([row[2] for row in a])
# --> [3, 6, 9]
Einfügen von Zeilen#
Da mehrdimensionale Listen in Python wie ganz normale Listen behandelt werden und nicht wie ein separater Datentyp, gibt es keine speziellen Methoden für mehrdimensionale Listen.
Daher muss man das Einfügen von Zeilen und Spalten selbst implementieren. Die meisten Algorithmen wissen im voraus wieviele Zeilen und Spalten benötigt werden.
Ein Beispiel hierfür wäre der Floyd-Warshall Algorithmus. Kurzgesagt, berechnet jener Algorithmus den kürzesten Pfad von jedem Knoten zu jedem anderen.
Die Distanzen zwischen den Knoten können etwa als zweidimensionale Liste dargestellt werden. Hier ist ein Beispiel mit drei Knoten A
, B
und C
.
A |
B |
C |
|
---|---|---|---|
A |
0 |
15 |
53 |
B |
7 |
0 |
3 |
C |
32 |
42 |
0 |
Die Tabelle ist so zu interpretieren, dass etwa die Zeile A
, Spalte B
bedeutet, dass der Pfad von A
nach B
, 15
Einheiten lang ist.
Da man die Pfade von allen Knoten zu allen anderen Knoten berechnet, weiß man, dass die Matrix die Dimension 3 x 3 benötigt.
Da keine neuen Zeilen oder vor allem Spalten hinzugefügt werden müssen, ist es kein Problem, dass es dafür keine eigenen Methoden gibt.
Wenn man aber Zeilen oder Spalten hinzufügen möchte, muss man sich selbst etwas überlegen.
Aufgabe#
Wenn Sie möchten können Sie sich überlegen, wie eine Methode um Zeilen und Spalten hinzuzufügen, aussehen könnte.
Der Einfachheit halber, können Sie annehmen, dass die Eingabe immer korrekt ist. Also dass z.B. bei einer Matrix mit 3 Spalten immer eine neue Zeile mit auch 3 Spalten eingefügt wird. Ebenfalls wird in eine Matrix mit 4 Zeilen immer eine neue Spalte mit 4 Zeilen hinzugefügt.
# Hier können Sie ihren Versuch schreiben...
def insert_row(matrix, zeile_index, zeile_werte):
...
def insert_column(matrix, spalte_index, spalte_werte):
...
a = [
[1,2,3],
[4,5,6],
[7,8,9]
]
print(a)
# Sollte ausgeben: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Schönere Darstellung:
# [[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]]
# In der dritten Zeile (Index 2) sollten danach die Werte [-2, -1, 0] stehen.
insert_row(a, 2, [-2, -1, 0])
print(a)
# Sollte ausgeben: [[1, 2, 3], [4, 5, 6], [-2, -1, 0], [7, 8, 9]]
# Schönere Darstellung:
# [[ 1, 2, 3],
# [ 4, 5, 6],
# [-2, -1, 0],
# [ 7, 8, 9]]
# In der zweiten Spalte (Index 1) sollten danach die Werte [10, 11, 12, 13] stehen.
insert_column(a, 1, [10, 11, 12, 13])
print(a)
# Sollte ausgeben: [[1, 10, 2, 3], [4, 11, 5, 6], [-2, 12, -1, 0], [7, 13, 8, 9]]
# Schönere Darstellung:
# [[ 1, 10, 2, 3],
# [ 4, 11, 5, 6],
# [-2, 12, -1, 0],
# [ 7, 13, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Lösung
def insert_row(matrix, zeile_index, zeile_werte):
matrix.insert(zeile_index, zeile_werte)
def insert_column(matrix, spalte_index, spalte_werte):
for zeile_index in range(0, len(matrix)):
matrix[zeile_index].insert(spalte_index, spalte_werte[zeile_index])
a = [
[1,2,3],
[4,5,6],
[7,8,9]
]
print(a)
# Sollte ausgeben: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Schönere Darstellung:
# [[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]]
# In der dritten Zeile (Index 2) sollten danach die Werte [-2, -1, 0] stehen.
insert_row(a, 2, [-2, -1, 0])
print(a)
# Sollte ausgeben: [[1, 2, 3], [4, 5, 6], [-2, -1, 0], [7, 8, 9]]
# Schönere Darstellung:
# [[ 1, 2, 3],
# [ 4, 5, 6],
# [-2, -1, 0],
# [ 7, 8, 9]]
# In der zweiten Spalte (Index 1) sollten danach die Werte [10, 11, 12, 13] stehen.
insert_column(a, 1, [10, 11, 12, 13])
print(a)
# Sollte ausgeben: [[1, 10, 2, 3], [4, 11, 5, 6], [-2, 12, -1, 0], [7, 13, 8, 9]]
# Schönere Darstellung:
# [[ 1, 10, 2, 3],
# [ 4, 11, 5, 6],
# [-2, 12, -1, 0],
# [ 7, 13, 8, 9]]
Das ist eine Möglichkeit. Man merkt, dass besonders das Einfügen von neuen Spalten nicht so simpel ist wie gedacht. Da hat man definitiv den Vorteil, wenn man externe Bibliotheken nutzt, welche diesen Prozess vereinfachen.