21

値が数値型か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

そのような関数が存在しない場合、次のような関数を書くのは難しくないはずです

isinstance(n, (int, float, decimal.Decimal, numpy.number, numpy.ndarray))

しかし、リストに含める必要がある他の数値型はありますか?

4

5 に答える 5

19

他の人が答えたように、あなたが言及したもの以外に他の数値型がある可能性があります。1 つのアプローチは、次のような方法で、必要な機能を明示的に確認することです。

# 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)

これは、最後の例を除くすべての例で機能します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

しかし、それを使用する頻度と引数によっては、これは実用的ではない場合があります (たとえば、大きな配列では遅くなる可能性があります)。

于 2009-02-01T14:22:55.923 に答える
7

また、numpy hasnumpy.isrealおよびその他の同様の機能 ( numpy.is+ Tab にはそれらが一覧表示されます)。

それらにはすべて楽しいコーナー ケースがありますが、そのうちの 1 つが役立つ可能性があります。

于 2010-01-21T01:00:35.943 に答える
6

一般に、未知の型を処理するための柔軟で高速かつ Pythonic な方法は、それらに対して何らかの操作を実行し、無効な型の例外をキャッチすることです。

try:
    a = 5+'5'
except TypeError:
    print "Oops"

このアプローチは、絶対的な型の確実性を判断するためにいくつかの関数を特別にケースアウトするよりも簡単に思えます。

于 2009-02-01T07:34:44.610 に答える
1

あなたis_numericは不明確です。あなたの質問に対する私のコメントをご覧ください。

他の数値タイプ: longcomplexfractions.Fractionnumpy.bool_numpy.ubyte...

operator.isNumberType()TrueはPython の数値と を返しますnumpy.array

isinstance(d, numbers.Number)Python 2.6 以降、 deprecated の代わりに使用できますoperator.isNumberType()

一般に、オブジェクトのタイプではなく、オブジェクトの機能 (たとえば、整数を追加できるかどうか) を確認することをお勧めします。

于 2009-02-01T07:31:03.383 に答える
1

isinstance(numpy.int32(4), numbers.Number)を返すFalseので、うまくいきません。operator.isNumberType()ただし、numpy.array([1]).

于 2010-01-20T08:54:13.053 に答える