numpy.matrix umwandeln

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
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Hallo liebe Leute,

ich stehe gerade etwas auf dem Schlauch. Zur Zeit rechne ich mit Punktdaten (x, y). Zu diesem Zweck habe ich mir numpy ausgeguckt. Zum Verschieben, Rotieren, Skalieren habe ich mir bereits einen Satz Funktionen [¹] zusammen gezimmert.

Code: Alles auswählen

>>> import math2d
>>> p = math2d.point(10., -5.)
>>> t = math2d.translate(2., 4.)
>>> r = math2d.rotate(-.23)
>>> transform = r * t
>>> transform * p
matrix([[ 9.73666395],
        [-4.86833198],
        [ 1.        ]])
>>> (transform * p)[:2]
matrix([[ 9.73666395],
        [-4.86833198]])
Ich stehe nun vor dem Problem, dass ich im Verlauf meines Programmes die Ergebnisse wieder als 2-Element iterable benötige (x, y).

Gibt die Standard-Bibliothek oder numpy einen eleganten Lösungsansatz her?

Vielen Dank im Voraus.

Grüße ...
Heiko
----
[¹]: http://paste.pocoo.org/show/221331/
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ist das die Antwort auf deine Frage?

Code: Alles auswählen

>>> a = numpy.matrix([[ 9.73666395],
...         [-4.86833198],
...         [ 1.        ]])
>>> x,y = a[:2]
>>> x
matrix([[ 9.73666395]])
>>> y
matrix([[-4.86833198]])
>>>
Wenn nicht, ist mir deine Fragestellung nicht ganz klar ;)

P.S. Wenn du lieber floats als Ergebnis haben willst:

Code: Alles auswählen

>>> x,y = map(float, a[:2])
>>> x
9.7366639500000005
>>> y
-4.8683319799999998

Edit: IMO ist deine Translations-Matrix falsch, Indexzugriff müsste mit [2,:2] erfolgen (nicht [:2,2]). Und an der Stelle sind die Klammern bei x und y außerdem unnötig, finde ich ohne deutlich übersichtlicher.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Wenn du nur einen Iterator brauchst, reicht auch 'flat':

Code: Alles auswählen

In [30]: v
Out[30]: 
matrix([[ 10.],
        [ -5.],
        [  1.]])

In [31]: v.flat
Out[31]: <numpy.flatiter object at 0x91afb70>

In [32]: for x in v.flat:
   ....:     print x
   ....:     
   ....:     
10.0
-5.0
1.0
Grüße
Gerrit
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Oder `imap`

Code: Alles auswählen

>>> from itertools import imap
>>> for i in imap(float, v):
...     print i
...
10.0
-5.0
1.0
SCNR :)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Antworten