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 log10
verscheen 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 prob
vullen met 10**-10
of een dummy-waarde voordat je de logaritme neemt om het probleem op te lossen. (Zorg er echter voor dat u prob > 0.0000000001
niet 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 where
in 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.sterr
om warnings
uit 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)