我有一个以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之类的东西吗?

谢谢


当前回答

要回答标题中的问题,判断变量是否是标量的直接方法是尝试将其转换为浮点数。如果你得到TypeError,它就不是。

N = [1, 2, 3]
try:
    float(N)
except TypeError:
    print('it is not a scalar')
else:
    print('it is a scalar')

其他回答

在numpy中是否有等效的isscalar() ?是的。

>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
>>> np.isscalar('abcd')
True

你可以检查变量的数据类型。

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

它会给你P的数据类型。

<type 'int'>

这样你就可以区分它是整数还是数组。

将@jamylak和@jpaddison3的答案结合在一起,如果需要健壮地将numpy数组作为输入,并以与列表相同的方式处理它们,则应该使用

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

这对于list, tuple和numpy数组的子类是健壮的。

如果您想对sequence的所有其他子类(不仅仅是list和tuple)也具有健壮性,请使用

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

为什么要用isinstance这样做,而不比较type(P)和目标值?下面是一个例子,在这里我们创建并研究NewList的行为,它是list的一个普通子类。

>>> 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比较为相等,但按类型处理它们会导致不同的行为。然而,由于x是list的一个子类的实例,使用isinstance(x,list)可以给出所需的行为,并以相同的方式对待x和y。

>>> N=[2,3,5]
>>> P = 5
>>> type(P)==type(0)
True
>>> type([1,2])==type(N)
True
>>> type(P)==type([1,2])
False

虽然@jamylak的方法更好,但这里有另一种方法

>>> N=[2,3,5]
>>> P = 5
>>> type(P) in (tuple, list)
False
>>> type(N) in (tuple, list)
True