2013-09-04 15 views
5

Uważam, że to bardzo dziwne. Czy ktoś może mi powiedzieć, co tu się dzieje?Numpy średnia funkcja zaokrąglania błąd

>>>a = [1,0,1] 
>>>np.mean(a) 
    0.66666666666666663 
>>>2.0/3 
    0.6666666666666666 

Co się dzieje z 3 w końcu wyjście np.mean(a)? Dlaczego nie jest to 6, jak linia poniżej lub 7 (przy zaokrąglaniu)?

+0

Dlaczego spadki? Przynajmniej wyjaśnij. To szwy całkowicie rozsądne ... chyba że nie przeczytasz pytania ... – Brian

+0

@Brian To pytanie zostało już wiele razy udzielone na tym forum. – Daniel

+4

@Ophion tak downvote, komentarz, że to dupe i link do jednego. Dlaczego ludzie po prostu "uderzać i uruchamiać" w dół, dodają nowego użytkownika, gdy dupki nie pojawiają się w wynikach wyszukiwania lub na pokrewnej liście? – Brian

Odpowiedz

5

To tylko przypadek inny ciąg znaków dwóch różnych typów:

In [17]: a = [1, 0, 1] 

In [18]: mean(a) 
Out[18]: 0.66666666666666663 

In [19]: type(mean(a)) 
Out[19]: numpy.float64 

In [20]: 2.0/3 
Out[20]: 0.6666666666666666 

In [21]: type(2.0/3) 
Out[21]: float 

In [22]: mean(a).item() 
Out[22]: 0.6666666666666666 

Porównują równy:

In [24]: mean(a) == 2.0/3 
Out[24]: True 

In [25]: mean(a).item() == 2.0/3 
Out[25]: True 

teraz może być czas, aby przeczytać o numpy scalars i numpy dtypes.

+0

Pythonowy float powinien być również 64-bitowy, wciąż nieco dziwny, że numpy drukuje to inaczej. –

+0

@BasSwinckels Nie jestem pewien, czy podążam za tobą. Mówisz tak, ponieważ oba typy zmiennoprzecinkowe są reprezentowane przez 64-bitowe reprezentacje, które powinny "repr" takie same, mimo że są one odrębnymi typami w hierarchii typów? –

+0

Rozumiem, że są to różne typy z różnymi reprami, ale obie powinny zawijać tę samą wartość float64. Wygląda na to, że w tym przypadku nie robi się żadnego wysiłku, aby repr pokazał, jaki to naprawdę jest, więc uważam za nieco zaskakujące, że nie używają tego samego algorytmu do utworzenia reprezentacji ciągów. –