入力に数値以外の値が少なくとも 1 つ含まれているかどうかを検出する関数を作成する必要があります。数値以外の値が見つかった場合はエラーが発生します (計算では数値のみを返す必要があるため)。入力配列の次元数は事前にわかりません。関数は ndim に関係なく正しい値を返す必要があります。さらに複雑な点として、入力は単一の float またはnumpy.float64
0 次元配列のような奇妙なものになる場合があります。
これを解決する明白な方法は、非反復可能オブジェクトが見つかるまで配列内のすべての反復可能オブジェクトを反復する再帰関数を記述することです。この関数は、numpy.isnan()
すべての非反復可能オブジェクトに適用されます。数値以外の値が少なくとも 1 つ見つかった場合、関数は直ちに False を返します。そうでない場合、反復可能オブジェクト内のすべての値が数値であれば、最終的に 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
ベストアンサー1
これは反復処理よりも高速であり、形状に関係なく機能します。
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