我有一个以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之类的东西吗?
谢谢
我很惊讶,这样一个基本的问题在python中似乎没有一个直接的答案。
在我看来,几乎所有提出的答案都使用了某种类型
检查,在python中通常不建议这样做,它们似乎仅限于特定的情况(它们失败于不同的数值类型或非元组或列表的泛型可迭代对象)。
对我来说,更好的方法是导入numpy并使用array。尺寸,例如:
>>> 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
but:
>>> 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__是否存在。
你可能会问为什么?原因包括:
流行的方法isinstance(obj, abc.Sequence)在一些对象(包括PyTorch的Tensor)上失败,因为它们没有实现__contains__。
不幸的是,Python的集合中什么都没有。abc,只检查__len__和__getitem__,我觉得这是数组类对象的最小方法。
它适用于列表,元组,ndarray,张量等。
废话不多说:
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
请注意,我添加了默认参数,因为大多数时候您可能希望将字符串视为值,而不是数组。元组也是如此。