python:如何识别一个variables是一个数组还是一个标量

我有一个函数,采用NBins的参数。 我想用一个标量50或一个数组[0, 10, 20, 30]来调用这个函数。 如何在函数中识别NBins的长度是多less? 或者换句话说,如果它是一个标量或vector?

我试过这个:

 >>> 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中的isarrayisscalar

谢谢

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

要支持任何types的序列,请检查collections.Sequence 。序列而不是list

注意isinstance也支持一个类的元组,应该避免type(x) in (..., ...)检查type(x) in (..., ...)是不必要的。

你也可能想检查not isinstance(x, (str, unicode))

以前的答案假定数组是一个Python标准列表。 作为经常使用numpy的人,我会推荐一个pythonictesting:

 if hasattr(N, "__len__") 

将@jamylak和@ jpaddison3的答案结合在一起,如果你需要将numpy数组作为input进行健壮的处理,并像列表一样处理它们,你应该使用

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

这对列表,元组和数组数组的子类是强健的。

如果你想对所有其他的序列子类(不仅仅是列表和元组),使用

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

为什么你应该用isinstance这样做,而不是将type(P)与目标值进行比较? 这里是一个例子,我们在这里研究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 

尽pipexy比较相等,但按type处理它们会导致不同的行为。 但是,由于xlist子类的一个实例,所以使用isinstance(x,list)给出了所需的行为,并以相同的方式处理xy

在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 

另一种替代方法(使用类属性):

 N = [2,3,5] P = 5 type(N).__name__ == 'list' True type(P).__name__ == 'int' True type(N).__name__ in ('list', 'tuple') True 

无需导入任何东西。

你可以检查variables的数据types。

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

它会把你输出为P的数据types

 <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答案。 在我看来,几乎所有提出的答案都使用某种types的检查,通常不build议在python中使用,它们似乎局限于特定情况(它们以不同的数字types失败,或者不是元组或列表的通用可迭代对象)。

对我来说,更好的办法是导入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 

只需使用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