Detect if a NumPy array contains at least one non-numeric value?
This video explains
Detect if a NumPy array contains at least one non-numeric value?
--
Become part of the top 3% of the developers by applying to Toptal
https://topt.al/25cXVn
--
Track title: CC F Haydns String Quartet No 53 in D
--
Chapters
00:00 Question
01:39 Accepted answer (Score 257)
02:20 Answer 2 (Score 26)
03:01 Answer 3 (Score 15)
04:33 Answer 4 (Score 3)
04:59 Thank you
--
Full question
https://stackoverflow.com/questions/9118...
Question links:
[NumPy]: http://en.wikipedia.org/wiki/NumPy
Answer 1 links:
[numpy.isfinite]: http://docs.scipy.org/doc/numpy/referenc...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #numpy
Detect if a NumPy array contains at least one non-numeric value?
--
Become part of the top 3% of the developers by applying to Toptal
https://topt.al/25cXVn
--
Track title: CC F Haydns String Quartet No 53 in D
--
Chapters
00:00 Question
01:39 Accepted answer (Score 257)
02:20 Answer 2 (Score 26)
03:01 Answer 3 (Score 15)
04:33 Answer 4 (Score 3)
04:59 Thank you
--
Full question
https://stackoverflow.com/questions/9118...
Question links:
[NumPy]: http://en.wikipedia.org/wiki/NumPy
Answer 1 links:
[numpy.isfinite]: http://docs.scipy.org/doc/numpy/referenc...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #numpy
ACCEPTED ANSWER
Score 292
This should be faster than iterating and will work regardless of shape.
numpy.isnan(myarray).any()
Edit: 30x faster:
import timeit
s = 'import numpy;a = numpy.arange(10000.).reshape((100,100));a[10,10]=numpy.nan'
ms = [
'numpy.isnan(a).any()',
'any(numpy.isnan(x) for x in a.flatten())']
for m in ms:
print " %.2f s" % timeit.Timer(m, s).timeit(1000), m
Results:
0.11 s numpy.isnan(a).any()
3.75 s any(numpy.isnan(x) for x in a.flatten())
Bonus: it works fine for non-array NumPy types:
>>> a = numpy.float64(42.)
>>> numpy.isnan(a).any()
False
>>> a = numpy.float64(numpy.nan)
>>> numpy.isnan(a).any()
True
ANSWER 2
Score 31
If infinity is a possible value, I would use numpy.isfinite
numpy.isfinite(myarray).all()
If the above evaluates to True, then myarray contains none of numpy.nan, numpy.inf or -numpy.inf.
numpy.isnan will be OK with numpy.inf values, for example:
In [11]: import numpy as np
In [12]: b = np.array([[4, np.inf],[np.nan, -np.inf]])
In [13]: np.isnan(b)
Out[13]:
array([[False, False],
[ True, False]], dtype=bool)
In [14]: np.isfinite(b)
Out[14]:
array([[ True, False],
[False, False]], dtype=bool)
ANSWER 3
Score 3
(np.where(np.isnan(A)))[0].shape[0] will be greater than 0 if A contains at least one element of nan, A could be an n x m matrix.
Example:
import numpy as np
A = np.array([1,2,4,np.nan])
if (np.where(np.isnan(A)))[0].shape[0]:
print "A contains nan"
else:
print "A does not contain nan"
ANSWER 4
Score 2
With numpy 1.3 or svn you can do this
In [1]: a = arange(10000.).reshape(100,100)
In [3]: isnan(a.max())
Out[3]: False
In [4]: a[50,50] = nan
In [5]: isnan(a.max())
Out[5]: True
In [6]: timeit isnan(a.max())
10000 loops, best of 3: 66.3 µs per loop
The treatment of nans in comparisons was not consistent in earlier versions.