RuntimeWarning: delen door nul aangetroffen in log

Ik gebruik numpy.log10 om de log van een reeks waarschijnlijkheidswaarden te berekenen. Er zijn enkele nullen in de array en ik probeer er omheen te komen met

result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)

Echter, RuntimeWarning: divide by zero encountered in log10verscheen nog steeds en ik weet zeker dat deze regel de waarschuwing veroorzaakte.

Hoewel mijn probleem is opgelost, weet ik niet waarom deze waarschuwing steeds weer verscheen?


Antwoord 1, autoriteit 100%

numpy.log10(prob)berekent de logaritme met grondtal 10 voor alle elementen van prob, zelfs de elementen die niet zijn geselecteerd door de where. Als je wilt, kun je de nullen van probvullen met 10**-10of een dummy-waarde voordat je de logaritme neemt om het probleem op te lossen. (Zorg er echter voor dat u prob > 0.0000000001niet berekent met dummy-waarden.)


Antwoord 2, autoriteit 63%

Je kunt het uitschakelen met seterr

numpy.seterr(divide = 'ignore') 

en weer verder met

numpy.seterr(divide = 'warn') 

Antwoord 3, autoriteit 33%

Gebruik gewoon het argument wherein np.log10

import numpy as np
np.random.seed(0)
prob = np.random.randint(5, size=4) /4
print(prob)
result = np.where(prob > 0.0000000001, prob, -10)
# print(result)
np.log10(result, out=result, where=result > 0)
print(result)

Uitvoer

[1.   0.   0.75 0.75]
[  0.         -10.          -0.12493874  -0.12493874]

Antwoord 4, autoriteit 26%

Ik heb dit opgelost door het laagste niet-nulgetal in de array te vinden en alle nullen te vervangen door een getal dat lager is dan het laagste :p

Resulterend in een code die er als volgt uitziet:

def replaceZeroes(data):
  min_nonzero = np.min(data[np.nonzero(data)])
  data[data == 0] = min_nonzero
  return data
 ...
prob = replaceZeroes(prob)
result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)

Houd er rekening mee dat bij alle getallen een kleine breuk wordt opgeteld.


Antwoord 5

Deze oplossing werkte voor mij, gebruik numpy.sterrom warningsuit te schakelen, gevolgd door where

numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)

Other episodes