python:如何识别变量是数组还是标量
我有一个函数需要NBins
的参数。 我想用标量50
或数组[0, 10, 20, 30]
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
要支持任何类型的序列,请检查collections.Sequence
。序列而不是list
。
注意 : isinstance
也支持一个类的元组,应该避免type(x) in (..., ...)
检查type(x) in (..., ...)
是不必要的。
你也可能想检查not isinstance(x, (str, unicode))
以前的答案假定数组是一个python标准列表。 作为经常使用numpy的人,我会推荐以下pythonic测试:
if hasattr(N, "__len__")
将@jamylak和@ jpaddison3的答案结合在一起,如果您需要将numpy数组作为输入进行健壮的处理,并以与列表相同的方式处理它们,则应该使用
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
这对列表,元组和numpy数组的子类是强健的。
如果你想对所有其他的序列子类(不仅仅是列表和元组)使用强壮的话
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
尽管x
和y
比较相等,但按type
处理它们会导致不同的行为。 但是,由于x
是list
子类的一个实例,所以使用isinstance(x,list)
给出所需的行为,并以相同的方式处理x
和y
。
上一篇: python: how to identify if a variable is an array or a scalar