2013-09-04 17 views
5

Lo trovo molto strano. Qualcuno può dirmi cosa sta succedendo qui?Numpy average function rounding off error

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

Che succede con il 3, alla fine della produzione di np.mean(a)? Perché non è un 6 come la linea sotto di esso o un 7 (in fase di arrotondamento)?

+0

Perché i downvotes? Almeno spiega. Questo è assolutamente ragionevole ... a meno che tu non legga effettivamente la domanda ... – Brian

+0

@Brian Questa domanda ha ricevuto risposta molte, molte volte su questo forum. – Daniel

+4

@Ophion so downvote, commenta che si tratta di un dupe e di un collegamento a uno. Perché le persone dovrebbero solo "colpire e lanciare" un nuovo utente downvote quando i dupes non vengono visualizzati in una ricerca o nell'elenco correlato? – Brian

risposta

5

Questo è solo un caso di una rappresentazione di stringa diversa di due tipi diversi:

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 

Essi risultano uguali:

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

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

ora potrebbe essere il momento di leggere su numpy scalars e numpy dtypes.

+0

Un float python dovrebbe anche essere a 64 bit, ancora un po 'strano che stampe numpy in modo diverso. –

+0

@BasSwinckels Non sono sicuro di seguire la tua discussione. Lo stai dicendo perché sono entrambi tipi in virgola mobile con una rappresentazione a 64 bit che dovrebbero 'repr' lo stesso, anche se sono tipi distinti nella gerarchia dei tipi? –

+0

Capisco che sono diversi tipi con diverse reprs, ma entrambi dovrebbero racchiudere lo stesso valore float64. Sembra che in questo caso non venga fatto alcuno sforzo per far sì che il repr mostri di che tipo sia realmente, quindi trovo leggermente sorprendente che non usino lo stesso algoritmo per creare la rappresentazione della stringa. –