入力に数値以外の値が少なくとも1つ含まれているかどうかを検出する関数を作成する必要があります。数値以外の値が見つかった場合は、エラーが発生します(計算では数値のみが返されるため)。入力配列の次元数は事前にわかっていません-関数はndimに関係なく正しい値を与える必要があります。追加の複雑さとして、入力は単一の浮動小数点数、numpy.float64
またはゼロ次元配列のような奇妙なボールでさえあります。
これを解決する明白な方法は、非反復が見つかるまで配列内のすべての反復可能なオブジェクトを反復する再帰関数を記述することです。これは、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
array(['None', 'None'], dtype=object)
ですか?そのような入力は単に例外を発生させるべきですか?
float('nan') in x
。それは動作しません。
contains_nan
は不審に見えます:「少なくとも1つの非数値が存在する場合はfalseを返します」。配列にNaNが含まれている場合は、contains_nan
返されるはずTrue
です。