[Numpy-discussion] nan_to_num and bool arrays

Bruce Southey bsouthey@gmail....
Fri Dec 11 13:11:41 CST 2009

On 12/11/2009 10:21 AM, Keith Goodman wrote:
> On Fri, Dec 11, 2009 at 12:50 AM, Nicolas Rougier
> <Nicolas.Rougier@loria.fr>  wrote:
>> Hello,
>> Using both numpy 1.3.0 and 1.4.0rc1 I got the following exception using
>> nan_to_num on a bool array, is that the expected behavior ?
>>>>> import numpy
>>>>> Z = numpy.zeros((3,3),dtype=bool)
>>>>> numpy.nan_to_num(Z)
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in<module>
>>   File "/usr/lib/python2.6/dist-packages/numpy/lib/type_check.py", line
>> 374, in nan_to_num
>>     maxf, minf = _getmaxmin(y.dtype.type)
>>   File "/usr/lib/python2.6/dist-packages/numpy/lib/type_check.py", line
>> 307, in _getmaxmin
>>     f = getlimits.finfo(t)
>>   File "/usr/lib/python2.6/dist-packages/numpy/core/getlimits.py", line
>> 103, in __new__
>>     raise ValueError, "data type %r not inexact" % (dtype)
>> ValueError: data type<type 'numpy.bool_'>  not inexact
> I guess a check for bool could be added at the top of nan_to_num. If
> the input x is a bool then nan_to_num would just return x unchanged.
> Or perhaps
> maxf, minf = _getmaxmin(y.dtype.type)
> could return False, True.
> Best bet is probably to file a ticket. And then pray.
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion

As documented, nan_to_num returns a float so it does not return the 
input unchanged.
That is the output of np.nan_to_num(np.zeros((3,3))) is a float array 
not an int array. This is also why np.finfo() fails because it is not 
give a float (that is, it also gives the same output if the argument to 
np.finfo() is an int rather than an boolean type).

I am curious why do you expect this conversion to work given how Python 
defines boolean types 

It is ambiguous to convert from boolean to float since anything that is 
not zero is 'True' and that NaN is not zero:
 >>> bool(np.PINF)
 >>> bool(np.NINF)
 >>> bool(np.NaN)
 >>> bool(np.PZERO)
 >>> bool(np.NZERO)

So what do you behavior do you expect to see?


More information about the NumPy-Discussion mailing list