Multidimensionales Array in Python

Diskutiere Multidimensionales Array in Python im Scriptsprachen Bereich.
J

JavaUndC-Prog

Hallo,

mein Hintergrund ist, dass ich aus der Java/C# Welt komme und daher von Python etwas abgeschreckt bin. Gerade Java und C# sind in meinen Augen besonders sorgfältig, wenn es um die Definition von Arrays geht, in Python erscheint mir das auf den ersten Blick deutlich komplizierter, was mich zu meiner Frage bringt.

In Java und C# kann ich problemlos ein mehrdimensionales Array erstellen, ich könnte z.B. in Java folgendes Machen:

Java:
double[][][] Array;
Array = new double[4][][];
Array[0] = new double[3][4];
Array[1] = new double[6][2];
// ...
Das schöne ist, dass es sich hierbei nicht um ein Rechteckiges Array handelt, sondern um ein Jagged Array. In C# könnte ich auch ein "richtiges" rechteckiges Array erstellen, doch für das was ich vorhabe ist das nicht wichtig. Meine Frage bezieht sich eher auf die "dynamische" Handhabung von Arrays und deren Umsetzung in Python. Unter dynamisch verstehe ich hier, dass ich von einem Programm z.B. auch Werte hätte ermitteln lassen können, die mir dann ein 3D Jagged Array erstellen würden, ohne das zuvor mit konkreten Werten zu initialisieren, ich hätte also auch sowas machen können Array[i] = new double[param_1][param_2], hiermit will ich nur diesen in meinen Augen dynamischen Charakter etwas unterstreichen.

Meine Frage ist daher, wie würde ich sowas in Python machen? Java initialisiert z.B. die Arrays standardmäßig mit 0 und das wäre auch in Ordnung für mich, wenn das in Python auch ginge, zusammen mit dieser dynamischen Initialisierung von Arrays, wie das in Java geht. Wie kann ich also ein 3D Jagged Array in Pyton erstellen?

Viele Grüße!
 
Zuletzt bearbeitet:
J

JavaUndC-Prog

Danke @M.L. , nach flüchtiger Lektüre, habe ich mein erstes 3D Array in Python umgesetzt:

Python:
elements = []
elements.append([])
elements.append([])
print(elements)
elements[0].append([])
print(elements)
elements[0][0].append(1)
elements[0][0].append(11)
elements[0][0].append('ALPHA')
print(elements)
print(elements[0][0][2])
Ausgabe:
Code:
[[], []]
[[[]], []]
[[[1, 11, 'ALPHA']], []]
ALPHA
Ich muss zugeben, dass das didaktisch recht gut gemacht ist. Die Frage wäre dann anschließend, wie man das Array am besten mit Nullen initialisieren könnte (Java mach das ja dankbarer Weise automatisch :) , wahrscheinlich mit einer For Schliefe in Kombination mit dem append Befehl würde ich vermuten)
 
M

M.L.

Die Vermutung ist nicht ganz falsch, Python verwendet eher eine "foreach"-Schleife oder "for in range"-Funktion, siehe das Beispiel bei geeksforgeeks ("Creating a multidimensional list with all zeros: ") sowie das Beispiel für den append-Befehl
Eine kleine Modifikation des genannten Beispiels:
Python:
m = 4
n = 5
  
a = [[0 for x in range(n)], [0 for x in range(m)], [1 for x in range(m-2)]] 
print(a)
Ergebnis auf der Kommandozeile: [[0, 0, 0, 0, 0], [0, 0, 0, 0], [1, 1]]
 
J

JavaUndC-Prog

Danke @M.L. das ist ein schöner Code, erinnert schon fast an Matlab, wie ich finde!

Dein Code ist auf jedenfall interessant, nur ich weiß noch nicht ganz, wie ich den für meine Zwecke nutzen kann, ich möchte mir ein Jagged Array erstellen, dass aus 3 Dimensionen besteht, die erste wird vom Nutzer eingelesen, die zweite Dimension soll variabel gehalten werden (Dimensionsbereich variabel) und die dritte Dimension wird dann auch variabel sein. Vielleicht kann ich dass nur realisieren, wenn ich mit verschiedenen For Schleifen arbeite...
 
Dompteur

Dompteur

Ich würde das obige Beispiel so umsetzen :
Python:
m = 4
n = 5
 
a = [ [0]*n, [0]*m, [1]*(m-2)]
print(a)
 
J

JavaUndC-Prog

@Dompteur das ist auch gut umgesetzt, aber wie würdest du jetzt die dritte Dimension ins Spiel bringen?

Mein Ziel ist es zu einer Eingabe (input), wie sie unten abgebildet ist ein Mehrdimensionales Array (Jagged Array) zu erstellen. In diesem Beispiel wird folgendes Array erzeugt: [None, [[0, 0, 0, 0]], [[0], [0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]] . Ich erzeuge zunächst ein einfaches Array mit 4 Elementen. Anschließend werden Teilarrays erzeugt, die in das Vorherige integriert werden, der erste Teil des ursprünglichen Arrays bleibt aber leer (None), wenn man den input betrachtet und dann das resultierende Array ergibt sich die Logik, sprachlich wäre das recht schwer auszudrücken, daher stelle ich den Code mal rein:
Python:
input = [4,1,3,4]
array = []

for x in range(len(input)):
    array.append([])
    if x == 0:
        array[0] = None
    if x > 0:
        for z in range(input[x]):
            array[x].append([0]*input[x-1])

print(array)
array[1][0][0] = 3.14
print(array)
Ausgabe:
Code:
[None, [[0, 0, 0, 0]], [[0], [0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]                                                                                             
[None, [[3.14, 0, 0, 0]], [[0], [0], [0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]
Vielleicht sieht jemand auch, wie man das besser lösen kann, als ich es gemacht habe :)
 
JCODA

JCODA

Bitte nenn' Deine Liste nicht input, input ist der Befehl für die Tastatureingabe.
Man könnte das bestimmt in einer Zeile mit der "richtigen" Comprehension lösen. Das sollte allerdings nicht das Ziel sein.
Pythons Listen sind sehr mächtig, auch deshalb, weil man verschiedene Typen speichern kann...
Deshalb muss man sich immer mal wieder Fragen, ob das Design sinnvoll ist ... oder einfach nur verwirrend.
Typischerweise würde man hier mit Dictionaries arbeiten, um den einzelnen Bestandteilen Namen zu geben.
Je nachdem, würden sich auch Klassen oder zumindest namedtuples anbieten.

Was stellt diese Datenstruktur eigentlich da? Vielleicht kommen wir dann auf ein besseres (vorallem verständlicheres!) Konzept.
 
J

JavaUndC-Prog

@JCODA Die Struktur modelliert einen Graphen und dessen Kanten. Es handelt sich hierbei um einen Graphen, dessen Knoten einer Ebene mit der nachfolge Ebene voll vermascht sind, die Struktur modelliert dann die Ebenen/Knoten mit der Gewichtung als Beziehung.

Das mit dem input als Namen ist noch ein guter Hinweis, sowie der Bezug zu den Dictionaries!
 
J

JavaUndC-Prog

Das ist eine interessante Quelle! Danke @M.L. !

Letztlich gibt es verschiedene Ansätze einen Graph zu modellieren, ob man das jetzt über Adjazenzmatrizen, Adj-Listen oder Inzidenzmatrizen macht, ist Situationsabhängig. Bei mir war es folgender Fall, ich hatte bereits eine 3 dimensionale Struktur, die den Graphen perfekt abgebildet hat, die auch in C# umgesetzt wurde und mich hat dann einfach interessiert, wie ich das in Python hätte machen können :)

Ich habe auch gesehen, dass es richtige Bibliotheken gibt, aber das erschien mir dann etwas zu viel zu sein, da ich in C# alles in Arrays bequem und einfach lösen konnte :)
 
Thema: 

Multidimensionales Array in Python

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben