检测一个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.nannumpy.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]将大于0A可以是一个nxmmatrix。

例:

 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"