Seite 1 von 1
Runden einer Matrix
Verfasst: Mittwoch 13. Mai 2009, 11:36
von bugsy25
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!
Verfasst: Mittwoch 13. Mai 2009, 11:46
von BlackVivi
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
Verfasst: Mittwoch 13. Mai 2009, 11:49
von CM
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

Verfasst: Mittwoch 13. Mai 2009, 12:01
von bugsy25
Genauso will ich es haben!
kann man das Ergebnis in einer neuen Matrix schreiben?
Verfasst: Mittwoch 13. Mai 2009, 12:04
von BlackVivi
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?
Verfasst: Mittwoch 13. Mai 2009, 12:33
von b.esser-wisser
... 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
Verfasst: Mittwoch 13. Mai 2009, 13:12
von bugsy25
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!
Verfasst: Mittwoch 13. Mai 2009, 13:13
von bugsy25
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?
Verfasst: Mittwoch 13. Mai 2009, 13:27
von 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.
Verfasst: Mittwoch 13. Mai 2009, 13:48
von bugsy25
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.
Verfasst: Mittwoch 13. Mai 2009, 13:53
von CM
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.
Verfasst: Mittwoch 13. Mai 2009, 13:58
von bugsy25
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.
Verfasst: Mittwoch 13. Mai 2009, 14:04
von 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.
Verfasst: Mittwoch 13. Mai 2009, 14:07
von EyDu
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:
Sonst kannst du die List Comprehension auch auflösen und ein for-Schleife draus machen.
Verfasst: Mittwoch 13. Mai 2009, 14:07
von CM
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
Verfasst: Mittwoch 13. Mai 2009, 15:00
von bugsy25
Danke Leute!!!!
Es hat endlich funktioniert!
