web-dev-qa-db-ja.com

数値がint型(coreまたはnumpy、signedまたはnot)であるかどうかを判断する方法は?

変数の型がintか、_np.int*_、_np.uint*_のいずれであるかをテストする必要があります。できれば単一の条件(ieいいえor)。

いくつかのテストの後、私はそれを推測します:

  • isinstance(n, int)intおよび_np.int32_(プレートフォームに応じて_np.int64_)とのみ一致します。
  • np.issubdtype(type(n), int)はすべてのintおよび_np.int*_と一致するようですが、_np.uint*_とは一致しません。

これは2つの質問につながります:_np.issubdtype_は、任意の種類の符号付き整数に一致しますか?数が符号付きまたは符号なし整数のいずれかの種類であるかどうかを単一のチェックで判断できますか?

これはintegersのテストに関するもので、フロートのようなものに対してはFalseを返す必要があります。

35
Arcturus B

NumPyは、Pythonタイプではなく、サブタイプのチェックに使用できる/すべきベースクラスを提供します。

_np.integer_を使用して、符号付きまたは符号なし整数のインスタンスをチェックします。

_np.signedinteger_および_np.unsignedinteger_を使用して、署名された型または署名されていない型を確認します。

_>>> np.issubdtype(np.uint32, np.integer)
True
>>> np.issubdtype(np.uint32, np.signedinteger)
False
>>> np.issubdtype(int, np.integer)
True
_

すべての浮動または複素数型は、テスト時にFalseを返します。

Python Falseは符号付き型であるため、np.issubdtype(np.uint*, int)は常にintになります。

これらすべての基本クラス間の関係を示す便利なリファレンスは、ドキュメント here にあります。

enter image description here

47
Alex Riley

タイプのタプルをpython isinstance()組み込み関数に渡すことをお勧めします。np.issubtype()に関する質問に関しては、どの種類にも一致しません整数型(int8、int32など)はすべてintのサブクラスであるため、これらのいずれかを渡すとTrueを返します。 intと一緒に入力します。

以下に例を示します。

_>>> a = np.array([100])
>>> 
>>> np.issubdtype(type(a[0]), int)
True
>>> isinstance(a[0], (int, np.uint))
True
>>> b = np.array([100], dtype=uint64)
>>> 
>>> isinstance(b[0], (int, np.uint))
True
_

また、より一般的なアプローチとして(特定のタイプのみを一致させたい場合は適切ではありません)、np.isreal()を使用できます:

_>>> np.isreal(a[0])
True
>>> np.isreal(b[0])
True
>>> np.isreal(2.4) # This might not be the result you want
True
>>> np.isreal(2.4j)
False
_
3
Kasramvd