List Comprehension

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drankaner
User
Beiträge: 13
Registriert: Freitag 27. Oktober 2017, 13:22

Moin Leute ich hoffe ich schreibe hier richtig.
Derzeit bin ich im Zuge meiner Masterarbeit dabei in Python ein 3D Bild zu triangulieren.

Ich versuche gerade eine Array zu erstellen in dem ich bestimmte Werte, bestimmten Punkten in einem Array zu zuordnen.

Beispiel

Code: Alles auswählen

a = [[0,3,2,7],[4,8,6,1],[10,9,5,11],[12,15,14,13]]
0 | 3 | 2 | 7
----------------
4 | 8 | 6 | 1
----------------
10 | 9 | 5 | 11
----------------
12 | 15 | 14 | 16

wenn ich nun mit folgendem Befehl:

Code: Alles auswählen

u, indices, test= numpy.unique(a, return_index=True,return_counts=True)
mir die Werte sortieren lasse bekomme ich bei indices die Position im Array, allerdings als Liste fortlaufend:

Code: Alles auswählen

 array([ 0,  7,  2,  1,  4, 10,  6,  3,  5,  9,  8, 11, 12, 15, 14, 13], dtype=int64)
Ich hätte aber gerne die Position in [X,Y] dargestellt.

Dafür würde ich eine List Comprehension verwenden:

Code: Alles auswählen

y=0
b = [ [x , y] if (x<4) else(x=0 , y=y+1) for x in indices]
So geht es aber nicht, habt ihr eventuell eine Idee ohne dass ich eine for Schleife Baue die Taktzeit frist?

Vielen Dank für eure Hilfe! :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe ehrlich gesagt das Problem noch nicht. Kannst du da ausholen?

Was ich dir aber verraten kann: du liegst falsch in deiner Annahmen, das listcomprehensions signifikant schneller sind als for-Loops. Erstere sind im Grunde nur syntaktischer Zucker für letzteres.

Wenn du wirklich aus Geschwindigkeit aus bist, musst du die puren numpy Mechanismen benutzen.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@drankaner: `unique` zum Sortieren zu benutzen, auf die Idee muß man erst mal kommen. Normalerweise sortiert man mit `sort`. Die Koordinaten kann man ganz einfach aus den Indizes ausrechnen:

Code: Alles auswählen

>>> m = numpy.array(a)
>>> k = m.argsort(axis=None)
>>> x = k % m.shape[1]
>>> y = k // m.shape[1]
>>> m
array([[ 0,  3,  2,  7],
       [ 4,  8,  6,  1],
       [10,  9,  5, 11],
       [12, 15, 14, 13]])
>>> k
array([ 0,  7,  2,  1,  4, 10,  6,  3,  5,  9,  8, 11, 12, 15, 14, 13])
>>> x
array([0, 3, 2, 1, 0, 2, 2, 3, 1, 1, 0, 3, 0, 3, 2, 1])
>>> y
array([0, 1, 0, 0, 1, 2, 1, 0, 1, 2, 2, 2, 3, 3, 3, 3])
>>> m[y[1],x[1]]
1
>>> m[y[2],x[2]]
2
drankaner
User
Beiträge: 13
Registriert: Freitag 27. Oktober 2017, 13:22

Vielen Dank für die Antworten!
@Sirius3: Der Vorteil an Unique ist, dass ich direkt weiß wie oft es mein Element gibt. Und da meine Elemente in meinen Arrays sich durchaus Wiederholen, ist dass recht wichtig als Info für mich.

Ich habe es jetzt erstmal über diesen weg gelöst:

Code: Alles auswählen

b = [ [x , x//4] if x<4 else[(x-(4*(x//4))),x//4] for x in indices]
Für Verbesserungsvorschläge bin ich offen :)
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@drankaner: was stört Dich an numpy-Arrays und Modulo?
Antworten