web-dev-qa-db-ja.com

numpy配列に整数が含まれているかどうかを確認するにはどうすればよいですか?

これには簡単な解決策があることは知っていますが、現時点ではそれを見つけることができないようです。

Numpy配列が与えられた場合、配列に整数が含まれているかどうかを知る必要があります。

複数のintdtype(int8、int16、int32、int64 ...)があるため、dtype自体をチェックするだけでは不十分です。

38
saffsd

numpy book で見つかりました! 23ページ:

階層内の他のタイプは、タイプの特定のカテゴリーを定義します。これらのカテゴリは、self.dtype.typeによって返されるオブジェクトが特定のクラスのものであるかどうかをテストするのに役立ちます(issubclassを使用)。

issubclass(n.dtype('int8').type, n.integer)
>>> True
issubclass(n.dtype('int16').type, n.integer)
>>> True
48
saffsd

整数型のチェックは、整数であるfloatでは機能しません。 _4._より良い解決策は次のようにnp.equal(np.mod(x, 1), 0)です。

_>>> import numpy as np
>>> def isinteger(x):
...     return np.equal(np.mod(x, 1), 0)
... 
>>> foo = np.array([0., 1.5, 1.])
>>> bar = np.array([-5,  1,  2,  3, -4, -2,  0,  1,  0,  0, -1,  1])
>>> isinteger(foo)
array([ True, False,  True], dtype=bool)
>>> isinteger(bar)
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
    True,  True,  True], dtype=bool)
>>> isinteger(1.5)
False
>>> isinteger(1.)
True
>>> isinteger(1)
True
_
22
Peter D

これも機能します:

  n.dtype('int8').kind == 'i'
8
Dan

Numpyのissubdtype()関数は次のように使用できます。

import numpy as np

size=(3,3)
A = np.random.randint(0, 255, size)
B = np.random.random(size)

print 'Array A:\n',  A
print 'Integers:', np.issubdtype(A[0,0], int)
print 'Floats:', np.issubdtype(A[0,0], float)

print '\nArray B:\n',  B
print 'Integers:', np.issubdtype(B[0,0], int)
print 'Floats:', np.issubdtype(B[0,0], float)

結果:

Array A:
[[  9 224  33]
 [210 117  83]
 [206 139  60]]
Integers: True
Floats: False

Array B:
[[ 0.54221849  0.96021118  0.72322367]
 [ 0.02207826  0.55162813  0.52167972]
 [ 0.74106348  0.72457807  0.9705301 ]]
Integers: False
Floats: True

PS。配列の要素は常に同じデータ型であることに注意してください。

6
funk

2009年から受け入れられた回答 はまだ有効ですが、 新しく拡張されたソリューション 2014年9月にリリースされたNumpyv0.19の時点で:

すべての数値numpyタイプは、python numbersモジュールのタイプ階層に登録されます。

これにより、dtypeをPythonの 数値抽象基本クラス と照合できます。

isinstance(np.dtype('int8'), numbers.Integral)
issubclass(np.dtype('int32').type, numbers.Integral)

numbers.Complexnumbers.Real、およびnumbers.Integralに対してテストできます。

P.S。.typeにアクセスする必要がなくなったため、行を数文字短くすることができます。 ;)

4
wedi