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中是否有类似isarrayisscalar东西?

谢谢


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

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

链接地址: http://www.djcxy.com/p/54227.html

上一篇: python: how to identify if a variable is an array or a scalar

下一篇: Function parameter types in Python