Runden einer Matrix

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
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

Hallo,

wie kann man eine solche Matrix V=[0.99998686753953003, 7.2599706140000003e-007, 0.0051249144334400004, 4.6075384730000003e-005, 0.99995830130755003, -0.0091320054296999999]') auf drei Stelle nach dem Komma runden?

Danke im Voraus!

Bugsy!
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Ich weiß zwar nicht, ob man Matrizen irgendwie anders rundet,... aber:

Code: Alles auswählen

In [5]: v = [0.99998686753953003, 7.2599706140000003e-007, 0.0051249144334400004
, 4.6075384730000003e-005, 0.99995830130755003, -0.0091320054296999999]
In [6]: [round(i, 3) for i in v]
Out[6]: [1.0, 0.0, 0.0050000000000000001, 0.0, 1.0, -0.0089999999999999993]
Wunder dich nicht, die einzelne Bestandteile sind gerundet, lediglich die Repräsentation intern ist anders, deswegen siehts so ungerundet aus:

Code: Alles auswählen

In [7]: for i in [round(i, 3) for i in v]:
   ...:     print i
   ...:
   ...:
1.0
0.0
0.005
0.0
1.0
-0.009
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo und willkommen im Forum,

Die Antwort ist: Gar nicht. Das hat was mit Fließkommazahlen und ihrer Darstellung im Rechner zu tun. Je nach Anwendung kannst Du die Ausgabe runden oder auf das decimal-Modul ausweichen.

HTH
Christian

edit: Zu spät :(
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

Genauso will ich es haben!
kann man das Ergebnis in einer neuen Matrix schreiben?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

bugsy25 hat geschrieben:Genauso will ich es haben!
kann man das Ergebnis in einer neuen Matrix schreiben?
Was hindert dich denn daran'ne neue Zuweisung zu machen?
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

... falls früher oder später numpy in's Spiel kommt: es gibt natürlich numpy.round(), was genauso funktioniert, wie erwartet:

Code: Alles auswählen

In [2]: V=[0.99998686753953003, 7.2599706140000003e-007,
0.0051249144334400004, 4.6075384730000003e-005,
0.99995830130755003, -0.0091320054296999999]

In [4]: a = numpy.array(V)

In [5]: a
Out[5]:
array([  9.99986868e-01,   7.25997061e-07,   5.12491443e-03,
         4.60753847e-05,   9.99958301e-01,  -9.13200543e-03])

In [6]: numpy.round(a,3)
Out[6]: array([ 1.   ,  0.   ,  0.005,  0.   ,  1.   , -0.009])
Vorsicht: numpy.array.__repr__ lässt es besser aussehen als es ist, das sind ja nach wie vor Gleitkommazahlen.

hth, Jörg
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

BlackVivi hat geschrieben:
bugsy25 hat geschrieben:Genauso will ich es haben!
kann man das Ergebnis in einer neuen Matrix schreiben?
Was hindert dich denn daran'ne neue Zuweisung zu machen?
Es klappt nicht mit einer neuen Zuweisung!
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

b.esser-wisser hat geschrieben:... falls früher oder später numpy in's Spiel kommt: es gibt natürlich numpy.round(), was genauso funktioniert, wie erwartet:

Code: Alles auswählen

In [2]: V=[0.99998686753953003, 7.2599706140000003e-007,
0.0051249144334400004, 4.6075384730000003e-005,
0.99995830130755003, -0.0091320054296999999]

In [4]: a = numpy.array(V)

In [5]: a
Out[5]:
array([  9.99986868e-01,   7.25997061e-07,   5.12491443e-03,
         4.60753847e-05,   9.99958301e-01,  -9.13200543e-03])

In [6]: numpy.round(a,3)
Out[6]: array([ 1.   ,  0.   ,  0.005,  0.   ,  1.   , -0.009])
Vorsicht: numpy.array.__repr__ lässt es besser aussehen als es ist, das sind ja nach wie vor Gleitkommazahlen.

hth, Jörg
kann man nicht array und die Klammer weglassen?
BlackJack

@bugsy25: Was nach ``Out[]:`` steht ist die *Ausgabe* des Python-Interpreters. So sehen `numpy.array`-Objekte nun einmal aus, wenn man sie mit `repr()` in eine Zeichenkette umwandelt.

Allerdings müsste man es auch wieder so eingeben, wenn man ein `numpy.array` haben möchte. Sonst wäre es ja nur eine Liste.
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

BlackJack hat geschrieben:@bugsy25: Was nach ``Out[]:`` steht ist die *Ausgabe* des Python-Interpreters. So sehen `numpy.array`-Objekte nun einmal aus, wenn man sie mit `repr()` in eine Zeichenkette umwandelt.

Allerdings müsste man es auch wieder so eingeben, wenn man ein `numpy.array` haben möchte. Sonst wäre es ja nur eine Liste.
Ich möchte eine Liste mit den gerundeten Werten haben.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

bugsy25 hat geschrieben:Ich möchte eine Liste mit den gerundeten Werten haben.
Das build-in round und das numpy.round sind +/- equivalent - jedenfalls für Deine Zwecke. Wenn Du mit Listen arbeiten willst, kannst Du das machen, wie es BlackVivi gezeigt hat. Aber nochmal deutlicher: Willst Du *wirklich* die Werte in der Liste runden oder doch lieber die Ausgabe? Lies Dir diesbezüglich mal den ersten Link durch, den ich gegeben habe.
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

CM hat geschrieben:
bugsy25 hat geschrieben:Ich möchte eine Liste mit den gerundeten Werten haben.
Das build-in round und das numpy.round sind +/- equivalent - jedenfalls für Deine Zwecke. Wenn Du mit Listen arbeiten willst, kannst Du das machen, wie es BlackVivi gezeigt hat. Aber nochmal deutlicher: Willst Du *wirklich* die Werte in der Liste runden oder doch lieber die Ausgabe? Lies Dir diesbezüglich mal den ersten Link durch, den ich gegeben habe.
Ich will die Werte in der Liste runden!!!!Damit will ich was anders machen!!!
BlackVivi's Methose ist schon ok aber die Werte sollen wieder in einem neuen Liste eingefügt werden.
BlackJack

@bugsy25: BlackVivi zeigt doch wie man mit einer "list comprehension" eine Liste mit den gerundeten Werten erzeugt. Und wenn Dir die `round()`-Funktion als Information nicht ausreicht notfalls selber eine Schleife zu schreiben, die eine Liste mit den gerundeten Werten erzeugt, dann solltest Du ein Tutorial durcharbeiten um Python-Grundlagen zu lernen. Zum Beispiel das in der Python-Dokumentation.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

bugsy25 hat geschrieben:BlackVivi's Methose ist schon ok aber die Werte sollen wieder in einem neuen Liste eingefügt werden.
Es wird doch eine neue Liste erstellt. Oder suchst du so etwas:

Code: Alles auswählen

alte_liste[:] = [round(i, 3) for i in v]
Sonst kannst du die List Comprehension auch auflösen und ein for-Schleife draus machen.
Das Leben ist wie ein Tennisball.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

bugsy25 hat geschrieben:Ich will die Werte in der Liste runden!!!!Damit will ich was anders machen!!!
Ich bin nicht schwerhörig!
Das ist aber genau, was ich befürchtete. Ich kann nicht umhin zu denken:
- Da will jemand mit einer Matrix rechnen und hat Fließkommazahlen.
- Ggf. wird das Teil eines größeren Programms bzw. gehört zu den ersten Schritten, bei denen man sich nicht solch *falsch* Herangehensweisen aneignen sollte.

Das Problem ist Folgendes: Wenn Du Zwischenschritte rundest, provozierst Du einen zusätzlichen systematischen (!) Fehler. Der pflanzt sich fort. In der numerischen Programmierung gilt als Faustregel: Immer mit der größten Genauigkeit rechnen und erst am Schluß, bei der Ausgabe, runden. Wie Du es damit hälst ist Deine Sache!
bugsy25 hat geschrieben:BlackVivi's Methose ist schon ok aber die Werte sollen wieder in einem neuen Liste eingefügt werden.
Wer hindert Dich die list comprehension einem neuen Namen zuzuweisen?

Gruß,
Christian
bugsy25
User
Beiträge: 10
Registriert: Dienstag 12. Mai 2009, 16:09

Danke Leute!!!!
Es hat endlich funktioniert! :lol:
Antworten