检测一个NumPy数组是否至less包含一个非数字值?
我需要编写一个函数来检测input是否包含至less一个非数字值。 如果find一个非数字值,我会引发一个错误(因为计算只能返回一个数字值)。 input数组的维数不是预先知道的 – 函数应该给出正确的值,而不pipendim。 作为一个额外的复杂的input可能是一个单一的浮动或numpy.float64
甚至古怪的像一个零维数组。
解决这个问题的显而易见的方法是编写一个recursion函数,迭代数组中的每个可迭代对象直到find一个非迭代。 它将在每个非可迭代对象上应用numpy.isnan()
函数。 如果至less有一个非数字值被find,那么函数将立即返回False。 否则,如果迭代中的所有值都是数值,则最终将返回True。
这工作得很好,但速度很慢,我期望NumPy有更好的方法来做到这一点。 什么是更快,更numpyish替代?
这是我的模型:
def contains_nan( myarray ): """ @param myarray : An n-dimensional array or a single float @type myarray : numpy.ndarray, numpy.array, float @returns: bool Returns true if myarray is numeric or only contains numeric values. Returns false if at least one non-numeric value exists Not-A-Number is given by the numpy.isnan() function. """ return True
这应该比迭代更快,并将工作,不pipe形状。
numpy.isnan(myarray).any()
编辑:快30倍:
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
结果:
0.11 s numpy.isnan(a).any() 3.75 s any(numpy.isnan(x) for x in a.flatten())
奖金:它适用于非数组NumPytypes:
>>> a = numpy.float64(42.) >>> numpy.isnan(a).any() False >>> a = numpy.float64(numpy.nan) >>> numpy.isnan(a).any() True
如果无穷大是可能的值,我会使用numpy.isfinite
numpy.isfinite(myarray).all()
如果上述评估为True
,那么myarray
包含numpy.nan
, numpy.inf
或-numpy.inf
值。
numpy.nan
将与numpy.inf
值一致,例如:
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)
用numpy 1.3或svn你可以做到这一点
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
在较早的版本中,对比的nans处理并不一致。
(np.where(np.isnan(A)))[0].shape[0]
如果A
包含至less一个nan
元素,则(np.where(np.isnan(A)))[0].shape[0]
将大于0
, A
可以是一个nxm
matrix。
例:
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"