web-dev-qa-db-ja.com

python:変数が配列かスカラーかを識別する方法

引数NBinsを取る関数があります。スカラ50または配列[0, 10, 20, 30]を使ってこの関数を呼び出したいです。関数内でどのようにしてNBinsの長さがわかりますか?それともスカラなのかベクトルなのか?

私はこれを試しました:

>>> N=[2,3,5]
>>> P = 5
>>> len(N)
3
>>> len(P)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>> 

ご覧のとおり、配列ではないのでlenPを適用することはできません。Pythonにはisarrayisscalarのようなものはありますか?

ありがとう

234
otmezger
>>> isinstance([0, 10, 20, 30], list)
True
>>> isinstance(50, list)
False

あらゆる種類のシーケンスをサポートするには、listではなくcollections.Sequenceをチェックしてください。

note isinstanceはTuple of classesもサポートしています。チェックtype(x) in (..., ...)は避けるべきで、不要です。

not isinstance(x, (str, unicode))もチェックしたいのですが

308
jamylak

これまでの回答では、この配列はPythonの標準リストであると仮定しています。でんぷんをよく使う人として、私は以下のPythonicテストをお勧めします。

if hasattr(N, "__len__")
97
jpaddison3

@jamylakと@ jpaddison3の回答を組み合わせることで、入力として派手な配列に対して頑健で、リストと同じように扱う必要がある場合は、次のようにします。

import numpy as np
isinstance(P, (list, Tuple, np.ndarray))

これはリストのサブクラス、Tuple、そして派手な配列に対してロバストです。

そして、リストやタプルだけでなく他のすべてのシーケンスのサブクラスに対しても堅牢にしたい場合は、次のようにします。

import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))

なぜisinstanceを使ってtype(P)を目標値と比較しないでください。これが例で、listの些細なサブクラスであるNewListの振る舞いを調べています。

>>> class NewList(list):
...     isThisAList = '???'
... 
>>> x = NewList([0,1])
>>> y = list([0,1])
>>> print x
[0, 1]
>>> print y
[0, 1]
>>> x==y
True
>>> type(x)
<class '__main__.NewList'>
>>> type(x) is list
False
>>> type(y) is list
True
>>> type(x).__name__
'NewList'
>>> isinstance(x, list)
True

xyは同じものとして比較されますが、それらをtypeで処理すると異なる動作になります。ただし、xlistのサブクラスのインスタンスなので、isinstance(x,list)を使用すると目的の動作が得られ、xyも同じ方法で処理されます。

34
scottclowe

Numpyにisscalar()と同等のものはありますか?はい。

>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
24
jmhl

@ jamylakのアプローチが優れていますが、これは代替のアプローチです。

>>> N=[2,3,5]
>>> P = 5
>>> type(P) in (Tuple, list)
False
>>> type(N) in (Tuple, list)
True
15
Sukrit Kalra

sizeの代わりにlenを使用するだけです。

>>> from numpy import size
>>> N = [2, 3, 5]
>>> size(N)
3
>>> N = array([2, 3, 5])
>>> size(N)
3
>>> P = 5
>>> size(P)
1
3
Mathieu Villion

他の代替アプローチ(class name propertyの使用):

N = [2,3,5]
P = 5

type(N).__== 'list'
True

type(P).__== 'int'
True

type(N).__in ('list', 'Tuple')
True

何もインポートする必要はありません。

3
Marek

変数のデータ型を確認できます。

N = [2,3,5]
P = 5
type(P)

Pのデータ型として出力されます。

<type 'int'>

あなたはそれが整数または配列であることを区別することができるように。

2
unnati patil
>>> N=[2,3,5]
>>> P = 5
>>> type(P)==type(0)
True
>>> type([1,2])==type(N)
True
>>> type(P)==type([1,2])
False
2
suhailvs

私は驚いたのですが、そのような基本的な質問がpythonではすぐには答えられないようです。私が思うに、提案された答えのほとんどはある種の型チェックを使っています。これは通常pythonではお勧めできませんし、特定のケースに限定されているようです。

私にとっては、もっとうまくいくのは、numpyのインポートとarray.sizeの使用です。例えば、

>>> a=1
>>> np.array(a)
Out[1]: array(1)

>>> np.array(a).size
Out[2]: 1

>>> np.array([1,2]).size
Out[3]: 2

>>> np.array('125')
Out[4]: 1

また注意しなさい:

>>> len(np.array([1,2]))

Out[5]: 2

しかし:

>>> len(np.array(a))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-f5055b93f729> in <module>()
----> 1 len(np.array(a))

TypeError: len() of unsized object
1
Vincenzooo

これが私が見つけた最良のアプローチです:__len____getitem__の存在を確認してください。

あなたはその理由を尋ねることがありますか?その理由は次のとおりです。

  1. これは、PythonのネイティブリストやTuple、NumPyのndarray、PyTorchのTensorなど、実際には有効な配列であるいくつかのオブジェクトを検出します。
  2. PyTorchのTensorを含むいくつかのオブジェクトでは、__contains__が実装されていないため、もう1つの一般的なメソッドisinstance(obj, abc.Sequence)が失敗します。
  3. Collections.abcを使用するのがはるかに望ましいですが、残念ながらPythonのcollections.abcには__len____getitem__のみをチェックするものはありません。

それ以上の面倒なことなしに:

def is_array_like(obj, string_is_array=False, Tuple_is_array=True):
    result = hasattr(obj, "__len__") and hasattr(obj, '__getitem__') 
    if result and not string_is_array and isinstance(obj, (str, abc.ByteString)):
        result = False
    if result and not Tuple_is_array and isinstance(obj, Tuple):
        result = False
    return result

デフォルトのパラメータを追加したことに注意してください。ほとんどの場合、文字列を配列ではなく値と見なすことをお勧めします。タプルについても同様です。

1
Shital Shah

preds_test [0]の形状は(128,128,1)です。isinstance()関数を使用してデータ型を確認してください。isinstanceは2つの引数を取ります。第1引数はデータです第2引数はデータ型isinstance(preds_test [0]、np.ndarray)は、OutputをTrueにします。 preds_test [0]は配列です。

0
Sumanth Meenan