オブジェクトにnumpy型があるかどうかを確実に判断するにはどうすればよいですか?
この質問はダックタイピングの哲学に反することを理解していますが、アイデアは、関数(scipyとnumpyを使用する)がnumpy型で呼び出されない限り、決してnumpy型を返さないようにすることです。 これは別の質問の解決策に登場します しかし、オブジェクトがnumpyタイプを持っているかどうかを判断する一般的な問題は、元の質問から十分に離れていると思います。
組み込みのtype
関数を使用して型を取得し、__module__
プロパティを使用して定義された場所を確認できます。
>>> import numpy as np
a = np.array([1, 2, 3])
>>> type(a)
<type 'numpy.ndarray'>
>>> type(a).__module__
'numpy'
>>> type(a).__module__ == np.__name__
True
私が思いついた解決策は次のとおりです。
isinstance(y, (np.ndarray, np.generic) )
ただし、 100%クリアではありません すべてのnumpyタイプはnp.ndarray
またはnp.generic
のいずれかであることが保証されており、これはおそらくバージョンの堅牢性に欠けます。
古い質問ですが、私は例で決定的な答えを思いつきました。同じ問題があり、明確な答えが見つからなかったので、質問を新鮮に保つために傷つけることはできません。重要なのは、numpy
がインポートされていることを確認してから、isinstance
boolを実行することです。これは簡単に思えるかもしれませんが、異なるデータ型で計算を行う場合、この小さなチェックは、numpyのベクトル化された操作を開始する前の簡単なテストとして役立ちます。
##################
# important part!
##################
import numpy as np
####################
# toy array for demo
####################
arr = np.asarray(range(1,100,2))
########################
# The instance check
########################
isinstance(arr,np.ndarray)
タイプを取得するには、組み込みのtype
関数を使用します。 in
演算子を使用すると、文字列numpy
が含まれているかどうかを確認することで、型がnumpy型かどうかをテストできます。
In [1]: import numpy as np
In [2]: a = np.array([1, 2, 3])
In [3]: type(a)
Out[3]: <type 'numpy.ndarray'>
In [4]: 'numpy' in str(type(a))
Out[4]: True
(この例は IPython で実行されました。ちなみに、インタラクティブな使用と簡単なテストに非常に便利です。)
それは実際にあなたが探しているものに依存します。
ndarray
であるかどうかをテストする場合、isinstance(..., np.ndarray)
がおそらく最も簡単です。モジュールが異なる可能性があるため、バックグラウンドでnumpyをリロードしないようにしてください。そうでない場合は、大丈夫です。 MaskedArrays
、matrix
、recarray
はすべてndarray
のサブクラスであるため、設定する必要があります。shape
属性とdtype
属性があるかどうかを確認できます。 dtype
を、np.core.numerictypes.genericTypeRank
にあるリストの基本的なdtypeと比較できます。このリストの要素は文字列であるため、tested.dtype is np.dtype(an_element_of_the_list)
...を実行する必要があることに注意してください。type(numpy.ndarray)
はtype
そのものであり、ブール型とスカラー型に注意してください。直感的でも簡単でもないので、がっかりしないでください。最初は苦痛です。
参照:- https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy-mypy
>>> import numpy as np
>>> np.ndarray
<class 'numpy.ndarray'>
>>> type(np.ndarray)
<class 'type'>
>>> a = np.linspace(1,25)
>>> type(a)
<class 'numpy.ndarray'>
>>> type(a) == type(np.ndarray)
False
>>> type(a) == np.ndarray
True
>>> isinstance(a, np.ndarray)
True
ブール値の楽しみ:
>>> b = a.astype('int32') == 11
>>> b[0]
False
>>> isinstance(b[0], bool)
False
>>> isinstance(b[0], np.bool)
False
>>> isinstance(b[0], np.bool_)
True
>>> isinstance(b[0], np.bool8)
True
>>> b[0].dtype == np.bool
True
>>> b[0].dtype == bool # python equivalent
True
スカラー型をもっと楽しくする:- https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
>>> x = np.array([1,], dtype=np.uint64)
>>> x[0].dtype
dtype('uint64')
>>> isinstance(x[0], np.uint64)
True
>>> isinstance(x[0], np.integer)
True # generic integer
>>> isinstance(x[0], int)
False # but not a python int in this case
# Try matching the `kind` strings, e.g.
>>> np.dtype('bool').kind
'b'
>>> np.dtype('int64').kind
'i'
>>> np.dtype('float').kind
'f'
>>> np.dtype('half').kind
'f'
# But be weary of matching dtypes
>>> np.integer
<class 'numpy.integer'>
>>> np.dtype(np.integer)
dtype('int64')
>>> x[0].dtype == np.dtype(np.integer)
False
# Down these paths there be dragons:
# the .dtype attribute returns a kind of dtype, not a specific dtype
>>> isinstance(x[0].dtype, np.dtype)
True
>>> isinstance(x[0].dtype, np.uint64)
False
>>> isinstance(x[0].dtype, np.dtype(np.uint64))
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type or Tuple of types
# yea, don't go there
>>> isinstance(x[0].dtype, np.int_)
False # again, confusing the .dtype with a specific dtype
# Inequalities can be tricky, although they might
# work sometimes, try to avoid these idioms:
>>> x[0].dtype <= np.dtype(np.uint64)
True
>>> x[0].dtype <= np.dtype(np.float)
True
>>> x[0].dtype <= np.dtype(np.half)
False # just when things were going well
>>> x[0].dtype <= np.dtype(np.float16)
False # oh boy
>>> x[0].dtype == np.int
False # ya, no luck here either
>>> x[0].dtype == np.int_
False # or here
>>> x[0].dtype == np.uint64
True # have to end on a good note!