回答问题

我需要编写一个函数来检测输入是否包含至少一个非数字值。如果找到非数字值,我将引发错误(因为计算应该只返回一个数字值)。输入数组的维数事先是未知的——不管 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
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐