[Numpy-discussion] Catching and dealing with floating point errors
Skipper Seabold
jsseabold@gmail....
Mon Nov 8 14:14:36 CST 2010
I am doing some optimizations on random samples. In a small number of
cases, the objective is not well-defined for a given sample (it's not
possible to tell beforehand and hopefully won't happen much in
practice). What is the most numpythonic way to handle this? It
doesn't look like I can use np.seterrcall in this case (without
ignoring its actual intent). Here's a toy example of the method I
have come up with.
import numpy as np
def reset_seterr(d):
"""
Helper function to reset FP error-handling to user's original settings
"""
for action in [i+'='+"'"+d[i]+"'" for i in d]:
exec(action)
np.seterr(over=over, divide=divide, invalid=invalid, under=under)
def log_random_sample(X):
"""
Toy example to catch a FP error, re-sample, and return objective
"""
d = np.seterr() # get original values to reset
np.seterr('raise') # set to raise on fp error in order to catch
try:
ret = np.log(X)
reset_seterr(d)
return ret
except:
lb,ub = -1,1 # includes bad domain to test recursion
X = np.random.uniform(lb,ub)
reset_seterr(d)
return log_random_sample(X)
lb,ub = 0,0
orig_setting = np.seterr()
X = np.random.uniform(lb,ub)
log_random_sample(X)
assert(orig_setting == np.seterr())
This seems to work, but I'm not sure it's as transparent as it could
be. If it is, then maybe it will be useful to others.
Skipper
More information about the NumPy-Discussion
mailing list