Seite 1 von 1

List Comprehension

Verfasst: Freitag 27. Oktober 2017, 13:35
von drankaner
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! :)

Re: List Comprehension

Verfasst: Freitag 27. Oktober 2017, 14:19
von __deets__
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.

Re: List Comprehension

Verfasst: Freitag 27. Oktober 2017, 14:55
von Sirius3
@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

Re: List Comprehension

Verfasst: Montag 30. Oktober 2017, 09:03
von drankaner
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 :)

Re: List Comprehension

Verfasst: Montag 30. Oktober 2017, 09:14
von Sirius3
@drankaner: was stört Dich an numpy-Arrays und Modulo?