Seite 1 von 1
numpy: Matrix anhand von index-Vektor filtern
Verfasst: Donnerstag 8. August 2013, 16:18
von Tyrax
Hallo Gemeinde,
ich habe ein vermutlich recht einfaches Problem, doch ich komme einfach nicht auf eine zufriedenstellende Lösung.
Sei also eine (3xn)-Matrix M gegeben und dazu ein Vektor A der Länge n mit Einträgen 0,1 oder 2. Jetzt will ich A auf M werfen, so dass ein Vektor B rauskommt, in dem zu jeder Zeile aus M das Element steht dessen Index in A angegeben ist.
Beispiel:
Code: Alles auswählen
M = array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
A = array([0, 2, 2,1])
B = array([0, 5, 8, 10])
Das sollte doch eigentlich ein Einzeiler sein. Meine Versuche gingen allerdings bisher ins Leere...
Danke und beste Grüße, Tyrax
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Donnerstag 8. August 2013, 17:16
von Tyrax
So, eine Möglichkeit habe ich gefunden:
Hat noch jemand, 'ne bessere Idee?
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 10:52
von schaeffkoch
vielleicht marginal schneller
Code: Alles auswählen
b=zeros(5)
for n in enumerate(a):
b[n[0]]=m[n[0],n[1]]
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 13:16
von cofi
Das sieht ja schlimm aus. Mit Sequence Unpacking:
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 13:28
von snafu
Nur aus Interesse: Hat das vom Threadersteller entdeckte `numpy.choose()` irgendwelche markanten Schwächen? Der ausformulierte Python-Code ist zwar nicht übelst schwer zu lesen oder so, aber man kann `choose()` doch ruhig nutzen, oder etwa nicht?
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 13:57
von schaeffkoch
choose hat natürlich keine schwächen, ist eben nur anscheinend ein bisschen langsamer.
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 15:16
von cofi
Da es hier um (potentiellen) Maschinencode gegen Python-Code geht und ich nicht viel Ahnung von Numpy/Scipy habe: Hast du das auch geprofiled?
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 16:01
von schaeffkoch
hat mich auch gewundert, aber vielleicht liegt es am transponieren der matrix.
Code: Alles auswählen
In [57]: timeit b=choose(a,m.T)
10000 loops, best of 3: 20.5 us per loop
In [59]: timeit b=choose_enum(a, m)
10000 loops, best of 3: 19.5 us per loop
....
In [61]: m2=m.T
In [64]: timeit b=choose(a, m2)
10000 loops, best of 3: 19.8 us per loop
hm nö..vielleicht einer eine erklärung?
Re: numpy: Matrix anhand von index-Vektor filtern
Verfasst: Samstag 10. August 2013, 16:20
von snafu
Man kann schon mit einem direkten Aufruf von `A.choose(M.T)` ein bißchen was rausholen, wenn man denn Wert darauf legt.