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中的isarray
或isscalar
?
谢谢
>>> 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
尽pipex
和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
另一种替代方法(使用类名属性):
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