2016-11-20 2 views
0

Ich hatte ein Problem mit Numpy Arrays und ich stolperte darüber, und es verwirrte mich.Python Zahlen auf mysteriöse Weise im Vergleich gerundet

Ich versuche, 2 Teile von Arrays zu vergleichen mit array_equal

np.array_equal(updated_image_values[j][k],np.array(initial_means[i])) 

Dies kehrt False, wenn die Zahlen

[ 0.90980393 0.8392157 0.65098041] 
[ 0.90980393 0.8392157 0.65098041] 

Oben ist mein Druck der beiden Arrays sind.

Allerdings, wenn ich die einzelnen Elemente drucken scheint eine der ohne

print updated_image_values[j][k][0] #0.909804 
print initial_means[i][0] #0.90980393 

Dann offensichtlich Grund gerundet zu werden, wenn diese einzelnen Elemente miteinander verglichen werden es False

print updated_image_values[j][k][0]==initial_means[i][0] #False 

zurück Kann mir jemand erklären, warum Python macht den Vergleich falsch und ohne ersichtlichen Grund die Zahlen zu runden?

+0

Fließkommazahlen stellen keinen genauen Wert dar. Zwei Schwimmer, die zufällig als gleich zu vergleichen sind, sind ein Zufall, auf den man nicht achten sollte oder auf den man sich verlassen sollte. – jasonharper

+1

Geben Sie eine 'np.set_printoptions (Genauigkeit = 16)' aus und vergleichen Sie die Arrays erneut ;-). – user7138814

+0

'set_printoptions' funktioniert !! – cjds

Antwort

0

Ich nehme an, dass updated_image_values einige Operationen darauf ausgeführt hat. Und welche Klassen sind die Zahlen?
Meine Vermutung ist, dass das, was Sie sehen, nicht "rundet", es hat etwas mit den __str__ oder __repr__ Funktionen der Klassen zu tun. Die Tatsache, dass Sie beim Drucken der Liste 0,90980393 sehen, bedeutet, dass das Element nicht wirklich auf 0,909804 gerundet wird. Versuchen Sie "{0:.10f}".format(updated_image_values[j][k][0]).
Wie beim Vergleich sehen Sie wahrscheinlich, dass die Gleitkommaoperationen den Wert so ändern, dass er außerhalb der Toleranz von array_equal liegt. Versuchen Sie, iscloseinstead zu verwenden.

+0

Während 'isclose' funktioniert' set_printopts' scheint richtiger zu sein – cjds

Verwandte Themen