引数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()
>>>
ご覧のとおり、配列ではないのでlen
にP
を適用することはできません。Pythonにはisarray
やisscalar
のようなものはありますか?
ありがとう
>>> 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))
もチェックしたいのですが
これまでの回答では、この配列はPythonの標準リストであると仮定しています。でんぷんをよく使う人として、私は以下のPythonicテストをお勧めします。
if hasattr(N, "__len__")
@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
x
とy
は同じものとして比較されますが、それらをtype
で処理すると異なる動作になります。ただし、x
はlist
のサブクラスのインスタンスなので、isinstance(x,list)
を使用すると目的の動作が得られ、x
とy
も同じ方法で処理されます。
Numpyにisscalar()と同等のものはありますか?はい。
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
@ jamylakのアプローチが優れていますが、これは代替のアプローチです。
>>> N=[2,3,5]
>>> P = 5
>>> type(P) in (Tuple, list)
False
>>> type(N) in (Tuple, list)
True
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
他の代替アプローチ(class name propertyの使用):
N = [2,3,5]
P = 5
type(N).__== 'list'
True
type(P).__== 'int'
True
type(N).__in ('list', 'Tuple')
True
何もインポートする必要はありません。
変数のデータ型を確認できます。
N = [2,3,5]
P = 5
type(P)
Pのデータ型として出力されます。
<type 'int'>
あなたはそれが整数または配列であることを区別することができるように。
>>> N=[2,3,5]
>>> P = 5
>>> type(P)==type(0)
True
>>> type([1,2])==type(N)
True
>>> type(P)==type([1,2])
False
私は驚いたのですが、そのような基本的な質問が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
これが私が見つけた最良のアプローチです:__len__
と__getitem__
の存在を確認してください。
あなたはその理由を尋ねることがありますか?その理由は次のとおりです。
__contains__
が実装されていないため、もう1つの一般的なメソッドisinstance(obj, abc.Sequence)
が失敗します。__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
デフォルトのパラメータを追加したことに注意してください。ほとんどの場合、文字列を配列ではなく値と見なすことをお勧めします。タプルについても同様です。
preds_test [0]の形状は(128,128,1)です。isinstance()関数を使用してデータ型を確認してください。isinstanceは2つの引数を取ります。第1引数はデータです第2引数はデータ型isinstance(preds_test [0]、np.ndarray)は、OutputをTrueにします。 preds_test [0]は配列です。