質問
値が数値型またはnumpyの配列のいずれかであるなら、私に教えてくれますnumpyの中の既存の機能はありますか? 、*、/、* - 私は、標準的な算術演算子を使用して操作することができる数値で、任意の表現を意味する「番号」によって、いくつかの異なる表現(の数字を処理する必要+、いくつかのデータ処理コードを書いています*)。
私が探している行動のいくつかの例
>>> is_numeric(5)
True
>>> is_numeric(123.345)
True
>>> is_numeric('123.345')
False
>>> is_numeric(decimal.Decimal('123.345'))
True
>>> is_numeric(True)
False
>>> is_numeric([1, 2, 3])
False
>>> is_numeric([1, '2', 3])
False
>>> a = numpy.array([1, 2.3, 4.5, 6.7, 8.9])
>>> is_numeric(a)
True
>>> is_numeric(a[0])
True
>>> is_numeric(a[1])
True
>>> is_numeric(numpy.array([numpy.array([1]), numpy.array([2])])
True
>>> is_numeric(numpy.array(['1'])
False
そのような機能が存在しない場合、私は1を書くこと難しいことではありません知っている、
のようなものisinstance(n, (int, float, decimal.Decimal, numpy.number, numpy.ndarray))
が、私はリストに含まれている必要があり、他の数値型があるのですか?
解決
、あなたが言及したもの以外の他の数値型があるかもしれません。 一つのアプローチのようなもので、あなたが望む機能のために明示的にチェックすることです。
# Python 2
def is_numeric(obj):
attrs = ['__add__', '__sub__', '__mul__', '__div__', '__pow__']
return all(hasattr(obj, attr) for attr in attrs)
# Python 3
def is_numeric(obj):
attrs = ['__add__', '__sub__', '__mul__', '__truediv__', '__pow__']
return all(hasattr(obj, attr) for attr in attrs)
これは最後の1、numpy.array(['1'])
以外のすべてのあなたの例のために動作します。 numpy.ndarray
は、数値演算のための特別なメソッドを持っていますが、文字列またはオブジェクトの配列を不適切にそれらを使用しようとする場合はTypeErrorを発生させているためです。あなたは、
... and not (isinstance(obj, ndarray) and obj.dtype.kind in 'OSU')
これは十分に良いかもしれません。
しかし...あなたはとても多くの確実な方法は、実際に計算を行うとキャッチしようとしている、の100%の誰かが同じ動作を持つ別のタイプを定義しないことを確認することはできません例外のようなもの。
def is_numeric_paranoid(obj):
try:
obj+obj, obj-obj, obj*obj, obj**obj, obj/obj
except ZeroDivisionError:
return True
except Exception:
return False
else:
return True
しかし、あなたが計画する頻度によってはそれを使用するとどのような引数を指定して呼び出すには、これは(それが大きなアレイと、例えば、潜在的に遅くなることがあります)。
実用的ではないかもしれません他のヒント
一般的には、未知のタイプを処理するために、柔軟な高速で、神託の方法は、単にそれらにいくつかの操作を実行すると、無効な種類の例外をキャッチすることです。
try:
a = 5+'5'
except TypeError:
print "Oops"
このアプローチは、絶対型確実性を決定するために、いくつかの機能を特殊ケースよりも容易であるように思わ。
また、numpyのは、(numpy.isreal
+タブは、それらをリストすべきである)numpy.is
及び他の同様の機能を有している。
彼らはすべて彼らの楽しいコーナーケースを持っていますが、それらの一つが有用である可能性があります。
あなたのis_numeric
は不明確です。あなたの質問に私のコメントを参照してください。
他の数値型は次のようになります。long
、complex
、fractions.Fraction
、numpy.bool_
、numpy.ubyte
、...
operator.isNumberType()
戻っはPythonの番号とTrue
ためnumpy.array
ます。
はPython 2.6以来あなたの代わりに、非推奨isinstance(d, numbers.Number)
のoperator.isNumberType()
を使用することができます。
一般的には、対象物(例えば、あなたがそれに整数を追加できるかどうか)とないその種類の機能をチェックすることをお勧めします。
isinstance(numpy.int32(4), numbers.Number)
は、False
を返します。 operator.isNumberType()
はnumpy.array([1])
含め、しかし、numpyの数字のすべての亜種の作業を行います。