RuntimeWarning: invalid value encountered in log

Viewed 9263

I become this expression: RuntimeWarning: invalid value encountered in log

while trying this:

def fct(a, b, c, d):
    global u1
    global u2
    if np.all(c > 0) and np.all(a > 0) and np.all(u1 != 0) and np.all(u2 != 0):
        return a, c, u1, u2

    u1, u2 = np.log(0.6*c), (math.e**d)**0.5
    F = np.log(a**2) + 6*[math.e**(-b)]/u1 + 3/u2
    print( F )

any idea??

2 Answers

This error message can emerge at two expression your code contains:

np.log(0.6*c) and np.log(a**2)

in the for loop with:

np.random.normal()

you will get random numbers at this distribution, whose values will be negative numbers.

That's why np.log(0.6*c will drop up the error message:

RuntimeWarning: invalid value encountered in log

And as Christoph noted below perfectly we have to be prepared for any 0, because both np.log(0.6*0) and np.log(0**2) will result in an error message too.

Example:

np.random.normal(10,4,100)

Out:

array([ 8.04664247, 14.4991884 , 10.89789303, 13.37593183,  3.29981902,
       16.6316143 , 10.64138342,  4.0459445 , 10.49192082, -3.04538967!!!!!,
       13.30443781,  4.13345961, 12.06508196, 10.4286879 ,  7.39431349,
       12.36789249,  9.20424736, 11.13161087, 12.15404482, 12.69897663,
        9.43633904, 12.77818913,  9.02926639,  4.78638573, 13.13104605,
       12.71197993,  6.1550897 ,  7.18496505,  4.3160573 ,  9.12631992,
        8.52408627, 12.45941119,  5.34780934,  5.7023213 , 13.53096085,
       12.1087058 ,  3.65110834,  5.15466232,  8.78768562, 12.54764999,
       15.12211713,  3.26481809,  9.8623701 , 15.88784306,  5.83355467,
        5.32775214,  8.81188865, 13.21886467,  6.78984216,  8.67260897,
        7.06100605, 13.75314668, 15.56562533, 10.33916552,  7.72745465,
       11.27606127, 11.56813697,  7.03177164, 10.63155512, 11.67072579,
       11.70855769, 10.78372397,  5.11327436, 15.61581808,  9.53446815,
       11.21806808, 11.2235412 ,  7.68339223, 12.71484256,  9.99613038,
       13.51834424,  7.73615596,  8.75145457, 13.02222188,  6.76757021,
       13.03580839, 10.67504642, 15.36110384, 15.66816384, -0.0952157 !!!!!!!! ,
        2.23551198, 11.21584659,  4.37791786,  5.45895529, 15.44411348,
       14.7077441 , 14.52080519,  3.70418827,  5.03132122,  5.24810117,
       16.35309566,  7.08504246,  6.81224092, 14.69274684,  8.43257572,
       12.87468578,  7.01621364,  7.62879265,  7.14646032, 20.16254855])

Stepping into your function inside of np.log()

c = np.array([ 8.04664247, 14.4991884 , 10.89789303, 13.37593183,  3.29981902,
       16.6316143 , 10.64138342,  4.0459445 , 10.49192082, -3.04538967,
       13.30443781,  4.13345961, 12.06508196, 10.4286879 ,  7.39431349,
       12.36789249,  9.20424736, 11.13161087, 12.15404482, 12.69897663,
        9.43633904, 12.77818913,  9.02926639,  4.78638573, 13.13104605,
       12.71197993,  6.1550897 ,  7.18496505,  4.3160573 ,  9.12631992,
        8.52408627, 12.45941119,  5.34780934,  5.7023213 , 13.53096085,
       12.1087058 ,  3.65110834,  5.15466232,  8.78768562, 12.54764999,
       15.12211713,  3.26481809,  9.8623701 , 15.88784306,  5.83355467,
        5.32775214,  8.81188865, 13.21886467,  6.78984216,  8.67260897,
        7.06100605, 13.75314668, 15.56562533, 10.33916552,  7.72745465,
       11.27606127, 11.56813697,  7.03177164, 10.63155512, 11.67072579,
       11.70855769, 10.78372397,  5.11327436, 15.61581808,  9.53446815,
       11.21806808, 11.2235412 ,  7.68339223, 12.71484256,  9.99613038,
       13.51834424,  7.73615596,  8.75145457, 13.02222188,  6.76757021,
       13.03580839, 10.67504642, 15.36110384, 15.66816384, -0.0952157 ,
        2.23551198, 11.21584659,  4.37791786,  5.45895529, 15.44411348,
       14.7077441 , 14.52080519,  3.70418827,  5.03132122,  5.24810117,
       16.35309566,  7.08504246,  6.81224092, 14.69274684,  8.43257572,
       12.87468578,  7.01621364,  7.62879265,  7.14646032, 20.16254855])

print(np.log(0.6*c))

Out:

[1.5744293  2.16326705 1.87774385 2.08263134 0.683042   2.30047974
 1.85392487 0.8868894  1.83977989    nan!!!! 2.07727203 0.90828911
 1.97948987 1.83373484 1.48988563 2.00427818 1.70883942 1.89896326
 1.9868364  2.03069579 1.73374247 2.03691412 1.6896455  1.05494996
 2.06415373 2.03171923 1.30645371 1.46116503 0.9515167  1.70033691
 1.63207021 2.01165063 1.16586138 1.23004771 2.09415483 1.98309906
 0.78420515 1.12907599 1.66252576 2.01870777 2.20533276 0.67237842
 1.77790089 2.25472861 1.25280091 1.16210379 1.66527617 2.07081933
 1.40460207 1.64934404 1.44376192 2.11044202 2.23423935 1.82511354
 1.5339539  1.91185638 1.93742888 1.43961306 1.85300085 1.94625801
 1.94949438 1.86721233 1.12101435 2.23745876 1.74408784 1.90670008
 1.90718784 1.52823552 2.03194439 1.79137243 2.09322197 1.53507929
 1.6583943  2.05583165 1.40131649 2.05687444 1.85708328 2.22101297
 2.24080525   nan!!!!! 0.29364465 1.90650203 0.96574761 1.18643181
 2.2264023  2.17754854 2.16475684 0.79863852 1.10485699 1.14704071
 2.28359159 1.44716024 1.40789551 2.17652834 1.62127664 2.04443742
 1.43739808 1.52110397 1.45579155 2.49300123]
/untitled0.py:37: RuntimeWarning: invalid value encountered in log

This can be overcome by a simple function to check for values equal to zero with:

    def safe_log(col_data):
        return list(map(lambda x: 0 if x == 0 else math.log(x), col_data.values))

where col_data is a Pandas dataframe column. For example:

ln_numbers = safe_log(df['my_column'])
Related