Multidimensionales Array in Python

JavaUndC-Prog

Bekanntes Mitglied
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:

JavaUndC-Prog

Bekanntes Mitglied
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.L.

Top Contributor
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]]
 

JavaUndC-Prog

Bekanntes Mitglied
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...
 

JavaUndC-Prog

Bekanntes Mitglied
@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

Top Contributor
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.
 

JavaUndC-Prog

Bekanntes Mitglied
@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!
 

JavaUndC-Prog

Bekanntes Mitglied
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 :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Falscher short Specifier löscht Inhalt von char Array Andere Programmiersprachen 20
E Fehler in Array-Methode Andere Programmiersprachen 2
E ganzes Array zurückgeben, wie? Andere Programmiersprachen 7
E 2 Arrays vergleichen u. das Array zurückgeben, welches kleinsten Wert beinhaltet. Andere Programmiersprachen 3
noah1407 Array vergleichen Andere Programmiersprachen 16
W for-Schleife gibt zweidimensionales Array falsch aus Andere Programmiersprachen 1
W Array in C++ ausgeben funktioniert nicht Andere Programmiersprachen 12
I Dynamischen Array in C++ Andere Programmiersprachen 5
krgewb Zweidimensionales Array in C# Andere Programmiersprachen 2
D Zeiger auf Array Andere Programmiersprachen 9
S Array erweitern c++ Andere Programmiersprachen 0
J foreach mit reference verändert array Andere Programmiersprachen 0
J Pointer auf char Array Andere Programmiersprachen 1
D [C] Array Auswahl und Wert Zuweisung Andere Programmiersprachen 4
B 2 Wege Kommunikation zwischen Python/selenium Code und von Diesem in Seite eingefügten Javascript Code? Andere Programmiersprachen 8
V Adding many Python files and directories to a single dmg file Andere Programmiersprachen 2
H When deployed to Heroku, python setup.py egg info did not run successfully. Andere Programmiersprachen 0
M Objektorientierte Programmierung in Python Andere Programmiersprachen 3
D Python - Vererbung Andere Programmiersprachen 2
D Tensorflow, Python - Code verstehen Andere Programmiersprachen 2
D Python - Tensorflow installieren - Datei in Spyder öffnen Andere Programmiersprachen 6
Kirby.exe Relative Imports in Python Andere Programmiersprachen 10
A Python Andere Programmiersprachen 3
D Python (Machine Learning) - linspace Andere Programmiersprachen 7
B Python: Wie entferne ich Daten aus einer Datei und plotte sie? Andere Programmiersprachen 2
G python – getting bad request on tests using django rest framework Andere Programmiersprachen 1
Kirby.exe Python - JSON Sortieren Andere Programmiersprachen 5
Kirby.exe Python – Valid Characters in JSON Andere Programmiersprachen 6
L Fehlermeldung beim lesen aus einer Datei mit Python Andere Programmiersprachen 4
D Decorators with parameters in Python Andere Programmiersprachen 2
Kirby.exe Python Anfänger schafft es nicht User Input einzulesen Andere Programmiersprachen 7
D Python - ModuleNotFoundError: Andere Programmiersprachen 6
G (Python) Werte einer ausgelesenen csv Datei verwalten Andere Programmiersprachen 2
D Python - pytz installieren Andere Programmiersprachen 5
M Python Objekte Andere Programmiersprachen 2
E Werte von Python an Java senden Andere Programmiersprachen 13
AssELAss Python Variable hochzählen? Andere Programmiersprachen 5

Ähnliche Java Themen

Neue Themen


Oben