检测一个 NumPy 数组是否包含至少一个非数字值?
回答问题 我需要编写一个函数来检测输入是否包含至少一个非数字值。如果找到非数字值,我将引发错误(因为计算应该只返回一个数字值)。输入数组的维数事先是未知的——不管 ndim 函数应该给出正确的值。作为一个额外的复杂因素,输入可能是单个浮点数或numpy.float64甚至是零维数组之类的奇怪东西。 解决这个问题的明显方法是编写一个递归函数,它遍历数组中的每个可迭代对象,直到找到一个非迭代对象。它将
·
回答问题
我需要编写一个函数来检测输入是否包含至少一个非数字值。如果找到非数字值,我将引发错误(因为计算应该只返回一个数字值)。输入数组的维数事先是未知的——不管 ndim 函数应该给出正确的值。作为一个额外的复杂因素,输入可能是单个浮点数或numpy.float64
甚至是零维数组之类的奇怪东西。
解决这个问题的明显方法是编写一个递归函数,它遍历数组中的每个可迭代对象,直到找到一个非迭代对象。它将对每个不可迭代的对象应用numpy.isnan()
函数。如果找到至少一个非数字值,则该函数将立即返回 False。否则,如果 iterable 中的所有值都是数字,它最终将返回 True。
这工作得很好,但它很慢,我希望NumPy有更好的方法来做到这一点。什么是更快,更麻木的替代方案?
这是我的模型:
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
Answers
这应该比迭代更快,并且无论形状如何都可以工作。
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())
奖励:它适用于非数组 NumPy 类型:
>>> a = numpy.float64(42.)
>>> numpy.isnan(a).any()
False
>>> a = numpy.float64(numpy.nan)
>>> numpy.isnan(a).any()
True
更多推荐
已为社区贡献126473条内容
所有评论(0)