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

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()
>>> 

ご覧のとおり、は配列ではないため、lenに適用することはできません.... Python にはや のようなものがありますか?Pisarrayisscalar

ありがとう

ベストアンサー1

>>> import collections.abc
>>> isinstance([0, 10, 20, 30], collections.abc.Sequence) and not isinstance([0, 10, 20, 30], (str, unicode))
True
>>> isinstance(50, collections.abc.Sequence) and not isinstance(50, (str, unicode))
False

:isinstanceクラスのタプルもサポートしていますが、チェックはtype(x) in (..., ...)避ける必要があり、不要です。

チェックしてみるのもいいかもしれませんnot isinstance(x, (str, unicode))

次のように指摘されている。@2080そしてまたこここれは配列では機能しませんnumpy。例:

>>> import collections.abc
>>> import numpy as np
>>> isinstance((1, 2, 3), collections.abc.Sequence)
True
>>> isinstance(np.array([1, 2, 3]), collections.abc.Sequence)
False

その場合は、翻訳::

>>> hasattr(np.array([1, 2, 3]), "__len__")
True
>>> hasattr([1, 2, 3], "__len__")
True
>>> hasattr((1, 2, 3), "__len__")
True

しかし、前述のようにここ、これも完璧ではなく、辞書をシーケンスとして誤って分類します(少なくとも私によると)。一方、isinstanceではcollections.abc.Sequence正しく分類されます。

>>> hasattr({"a": 1}, "__len__")
True
>>> from numpy.distutils.misc_util import is_sequence
>>> is_sequence({"a": 1})
True
>>> isinstance({"a": 1}, collections.abc.Sequence)
False

ソリューションを次のようにカスタマイズし、isinstanceニーズに応じてさらにタイプを追加することができます。

>>> isinstance(np.array([1, 2, 3]), (collections.abc.Sequence, np.ndarray))
True
>>> isinstance([1, 2, 3], (collections.abc.Sequence, np.ndarray))
True

おすすめ記事