123

オブジェクトがnumpyタイプであるかどうかを確実に判断するにはどうすればよいですか?

この質問はダックタイピングの哲学に反していることは理解していますが、関数(scipyとnumpyを使用)がnumpy型で呼び出されない限り、numpy型を返さないようにすることが目的です。 これは別の質問の解決策になりますが、オブジェクトがnumpyタイプであるかどうかを判断する一般的な問題は、元の質問から十分に離れているため、分離する必要があります。

4

6 に答える 6

133

組み込み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
于 2012-09-24T17:36:59.283 に答える
94

私が思いついた解決策は次のとおりです。

isinstance(y, (np.ndarray, np.generic) )

ただし、すべてのnumpyタイプがまたはのいずれかであることが保証されていることは100%明確ではなく、これはおそらくバージョンロバストではありません。np.ndarraynp.generic

于 2012-09-24T16:49:46.857 に答える
27

古い質問ですが、私は例を挙げて決定的な答えを思いつきました。私はこれと同じ問題を抱えていて、明確な答えを見つけられなかったので、質問を新鮮に保つことを傷つけることはできません。numpy重要なのは、インポートしたことを確認してから、 isinstanceboolを実行することです。これは単純に思えるかもしれませんが、さまざまなデータ型にわたって計算を行う場合、この小さなチェックは、厄介なベクトル化された操作を開始する前の簡単なテストとして役立ちます。

##################
# important part!
##################

import numpy as np

####################
# toy array for demo
####################

arr = np.asarray(range(1,100,2))

########################
# The instance check
######################## 

isinstance(arr,np.ndarray)
于 2016-10-16T02:30:37.143 に答える
11

それは実際にあなたが探しているものに依存します。

  • シーケンスが実際にであるかどうかをテストする場合は、おそらくndarrayaisinstance(..., np.ndarray)が最も簡単です。モジュールが異なる可能性があるため、バックグラウンドでnumpyをリロードしないように注意してください。そうでない場合は、問題ないはずです。MaskedArrays、、はすべてのサブクラスであるためmatrix、設定する必要があります。recarrayndarray
  • スカラーがnumpyスカラーであるかどうかをテストする場合は、少し複雑になります。shapedtype属性があるかどうかを確認できます。dtypeそれを基本的なdtypeと比較することができます。そのリストはで見つけることができますnp.core.numerictypes.genericTypeRank。このリストの要素は文字列であるため、tested.dtype is np.dtype(an_element_of_the_list)...を実行する必要があることに注意してください。
于 2012-09-24T18:20:19.877 に答える
8

タイプを取得するには、組み込み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で実行されました。インタラクティブな使用と迅速なテストに非常に便利です。)

于 2012-09-24T17:04:47.733 に答える
5

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!
于 2019-02-01T02:16:16.107 に答える