De ce „numpy.mean” returnează ‘inf’? (Programare, Python, Numpy)

www.pieronigro.de a intrebat.
a intrebat.

Trebuie să calculez media pe coloane a unui array cu mai mult de 1000 de rânduri.

np.mean(some_array) Îmi dă inf ca rezultat

dar sunt destul de sigur că valorile sunt ok. Încarc un csv din aici în fișierul meu Data variabilă și coloana „ciment” este „sănătoasă” din punctul meu de vedere.

In[254]:np.mean(Data[:230]['Cement'])
Out[254]:275.75

dar dacă măresc numărul de rânduri începe problema:

In [259]:np.mean(Data[:237]['Cement'])
Out[259]:inf

dar când mă uit la „Data

In [261]:Data[230:237]['Cement']
Out[261]:
 array([[ 425. ],
        [ 333.  ],
        [ 250.25],
        [ 491.  ],
        [ 160.  ],
        [ 229.75],
        [ 338.  ]], dtype=float16)

nu găsesc un motiv pentru acest comportamentP.S Acest lucru se întâmplă în Python 3.x folosind wakari (Ipython bazat pe cloud)

Versiunea Numpy „1.8.1

Încarc Datele cu:

No_Col=9
conv = lambda valstr: float(valstr.replace(',','.'))

c={}
for i in range(0,No_Col,1):
    c[i] = conv

Data=np.genfromtxt(get_data,dtype=float16 , delimiter='t', skip_header=0, names=True,   converters=c)

Comentarii

  • Nu pot reproduce eroarea cu aceste date. De asemenea, datele pe care le văd în acele numere de rând din CSV nu sunt aceleași cu cele pe care le afișați. Cum le încărcați? –  > Por BrenBarn.
  • Ghiciți: se supraîncarcă flotorul? Văd că folosești un float pe 16 biți care are o valoare maximă de 65504. –  > Por LinearZoetrope.
  • am editat întrebarea pentru a fi mai precisă. –  > Por www.pieronigro.de.
  • Da, ăsta pare să fie motivul. @Hiatus, de ce folosești float16? –  > Por BrenBarn.
  • În afară de asta: recomandare standard – dacă lucrezi cu date în care vrei să numești coloanele, probabil că e mai bine să folosești pandas decât cu numpy gol. –  > Por DSM.
1 răspunsuri
Craig J Copi

Voi ghici că problema este de precizie (așa cum au comentat și alții). Citez direct din documentația pentru mean() vedem

Note

Media aritmetică este suma elementelor de-a lungul axei împărțită la numărul de elemente.

Rețineți că pentru intrările în virgulă mobilă, media este calculată folosind aceeași precizie pe care o are intrarea. În funcție de datele de intrare, acest lucru poate face ca rezultatele să fie inexacte, în special pentru float32 (a se vedea exemplul de mai jos). Specificarea unui acumulator de precizie mai mare cu ajutorul instrucțiunii dtype poate atenua această problemă.

Deoarece matricea dvs. este de tip float16, aveți o precizie foarte limitată. Utilizarea dtype=np.float64 va atenua probabil depășirea. Consultați, de asemenea, exemplele din secțiunea mean() documentație.