Forum: PC-Programmierung mehrdimensionale Arrays in Python


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich habe unter C folgendes mehrdimensionale Array geschrieben:
1
uint8_t lichtsteuerung[14][8] = {  {1,0,1,0,1,0,1,0},
2
                      {0,1,0,1,0,1,0,1},
3
                      {1,1,0,0,1,0,1,0},
4
                      {1,0,1,1,0,1,1,0},
5
                      {0,1,0,1,0,1,0,1},
6
                      {1,0,1,0,1,0,1,1},
7
                      {0,1,0,0,1,1,0,0},
8
                      {1,0,1,1,0,0,1,1},
9
                      {0,1,0,1,0,1,1,0},
10
                      {1,0,1,0,1,1,0,1},
11
                      {1,1,0,1,1,0,1,0},
12
                      {0,1,0,0,0,1,1,1},
13
                      {1,0,1,1,1,0,0,0},
14
                      {0,1,0,1,0,1,0,1}
15
                    };

Im Forum passt jetzt die Einrückung der ersten Zeile nicht, in der 
Entwicklungsumgebung passt es.

Jede Zeile steht für einen bestimmten Zeitpunkt, jede Spalte für eine 
Lampe. Ich kann durch die tabellarische Ansicht schön Übersichtlich 
meine Steuerung konfigurieren.

Jetzt möchte ich so ein Konstrukt unter Python erstellen.
Ich habe bisher folgendes gefunden:

Variante 1:
1
lichtsteuerung=[[1,0,1],[1,1,0],[0,0,0]]
Das ist allerdings sehr unübersichtlich, wenn alles in einer Zeile 
steht. Bei der Variante oben stehen die Werte für eine Lampe immer 
direkt untereinander, das ist viel besser.

Variante 2:
1
a=[1,0,1]
2
b=[1,1,0]
3
c=[0,0,0]
4
lichtsteuerung=[a,b,c]
Hier hätte ich die Werte einer Lampe wieder direkt untereinander, müsste 
aber zum Schluss alle Listen zu einer "Gesamtliste" zusammenbauen. Bei 
dem Beispiel sind es jetzt 3 Stück, können aber im Programm locker mal 
so um die 100 werden. Und spätestens wenn bei einer Programmänderung 
eine Zeile zwischen drin eingefügt werden muss wird es unübersichtlich.

Hat jemand eine Idee, wie man das in Python lösen kann? In C 
funktioniert das ja wunderbar. Mein Codebeispiel ist aus einer Firmware 
für einen Controller. Das Programm das ich jetzt machen möchte ist ein 
Python Script für einen Raspberry, das unter anderem die RS232 und die 
GPIOs steuert. Das möchte ich nicht unbedingt in C schreiben.

von Sven B. (scummos)


Lesenswert?

Hi,

für sowas nimmt man in Python numpy.array.

Außerdem kannst du das auch mit Listen genauso hinschreiben wie in C:
1
a = [
2
  [1, 2, 3],
3
  [4, 5, 6],
4
  [7, 8, 9]
5
]

von Imonbln (Gast)


Lesenswert?

Sven B. schrieb:
> Außerdem kannst du das auch mit Listen genauso hinschreiben wie in C:a =
> [
>   [1, 2, 3],
>   [4, 5, 6],
>   [7, 8, 9]
> ]

vielleicht sollte der TO auch über tuple nachdenken die sind immutable 
und ich nehme mal stark an das die inneren Listen/tuples sich nicht 
ändern werden. Abgesehen davon sind die inneren Listen alle 8 Bytes groß 
vielleicht ist es Sinnvoll, diese als Hexvalues zu speichern und 
stattdessen nur mit einem eindimensionalen Array zu arbeiten. der 
Converter von Hex zu Bits ist schnell geschrieben in Python zum Beispiel
1
def hex2bit(hex):
2
   return [int(x) for x in bin(hex)[2:].zfill(8)]

von Sven B. (scummos)


Lesenswert?

Wenn man für diese Trivialaufgabe ein Python hochfährt, ist die 
Performance vermutlich egal. Wenn sie es nicht ist, ist np.array 
sicherlich mit Abstand die schnellste Variante, wie immer in Python.

von Le X. (lex_91)


Lesenswert?

Sven B. schrieb:
> Wenn man für diese Trivialaufgabe ein Python hochfährt,

Dauert denn "Python hochfahren" länger als z.B. "gcc hochfahren"?
Was würdest du denn für diese Aufgabe "hochfahren"?

von Rolf M. (rmagnus)


Lesenswert?

Und was verstehst du unter

Sven B. schrieb:
> für diese Trivialaufgabe

? Das Array ist ja nur Mittel zum Zweck für einen Teil eines größeren 
Programms.

von Heiner (Gast)


Lesenswert?

Sven B. schrieb:
> Außerdem kannst du das auch mit Listen genauso hinschreiben wie in C:a =
> [
>   [1, 2, 3],
>   [4, 5, 6],
>   [7, 8, 9]
> ]

Kleiner Hinweis: In der vorletzten Zeile darf und imho sollte man noch 
ein Komma setzen, also:
1
[
2
    [1, 2, 3],
3
    [4, 5, 6],
4
    [7, 8, 9],
5
]

Begründung aus PEP 3:
https://www.python.org/dev/peps/pep-0008/#when-to-use-trailing-commas


Imonbln schrieb:
> vielleicht sollte der TO auch über tuple nachdenken die sind immutable
> und ich nehme mal stark an das die inneren Listen/tuples sich nicht
> ändern werden.

Ich sehe nicht, warum die Anzahl der Lampen nicht auch veränderlich sein 
sollte, aber grundsätzlich bin ich bei diesem Einwand voll dabei: Es 
macht wenig Sinn, den C-Code möglichst direkt in Python zu übersetzen. 
Wenn man Python verwendet, sollte man auch die dort verfügbaren 
Konstrukte verwenden, um den Sachverhalt zu modellieren. Die einzelne 
Lampe über den Index zu identifizieren ist wenig "pythonic" und die 
Zeitpunkte, für die diese Zustände stehen, an anderer Stelle zu halten, 
wäre in jeder Sprache mit Objektorientierung mindestens ein wenig 
seltsam.

Eine bessere Struktur könnten Dictionaries sein oder man macht gleich 
eine eigene Klasse daraus.


Sven B. schrieb:
> np.array

... mag performant sein. Es modelliert aber mit einiger Sicherheit nicht 
den Sachverhalt, um den es hier geht.

von R. F. (inet_surfer88)


Lesenswert?

Das Array ist nur mittel zum Zweck, da steht schon noch mehr dahinter. 
Es wird auch nicht ein c Programm auf Python umgeschrieben. Ich hab den 
c-Schnipsel nur aus einem anderen Programm rauskopiert um zu zeigen wie 
ich es gerne hätte. Da ich ja beim Programmieren auch dazu lernen möchte 
werde ich mir numpy mal anscheuen, habe ich bisher noch nichts von 
gehört. Auch die schreibweise wie im c-beispiel werd ich nochmals 
probieren, das gab bei mir eine Fehlermeldung. Versuche das aber 
nochmals und poste ggf. dir Meldung.

von Yalu X. (yalu) (Moderator)


Lesenswert?

R. F. schrieb:
> Auch die schreibweise wie im c-beispiel werd ich nochmals
> probieren, das gab bei mir eine Fehlermeldung. Versuche das aber
> nochmals und poste ggf. dir Meldung.

Die Regeln für das Umbrechen von Programmzeilen sind in Python etwas
strenger als in C. Lies dir dazu auf der folgenden Webseite die
Abschnitte 2.1.5 und 2.1.6 durch:

  https://docs.python.org/3/reference/lexical_analysis.html#explicit-line-joining

von Sven B. (scummos)


Lesenswert?

Le X. schrieb:
> Sven B. schrieb:
>> Wenn man für diese Trivialaufgabe ein Python hochfährt,
>
> Dauert denn "Python hochfahren" länger als z.B. "gcc hochfahren"?

Natürlich dauert es länger, ein Python-Programm zu starten, als ein 
C-Programm. Ist das eine ernstgemeinte Frage? Hier ein Hello World:

Python 61.229.106      instructions:u
C++     3.025.067      instructions:u
C         206.162      instructions:u

> Was würdest du denn für diese Aufgabe "hochfahren"?

Es ist schon ok, Python zu verwenden. Nur macht es keinen Sinn, bei 
einem Array mit 5x11 Items die Performance zu optimieren mit 
irgendwelchen Hex-Tricks. Das ist einfach absurd. Es liegt einfach nahe, 
dass die Performance im vorliegenden Fall relativ egal ist, weshalb ich 
die einfachste Lösung bevorzugen würde.

Und noch einmal, wenn Performance irgendeine Rolle spielt, ist 
numpy.array die Lösung und nicht eine Liste von Tupeln mit Hexwerten. 
Zudem ist numpy.array vermutlich sogar gleichzeitig die einfachste 
Lösung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.