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

谢谢


当前回答

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

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

其他回答

>>> import collections.abc
>>> isinstance([0, 10, 20, 30], collections.abc.Sequence)
True
>>> isinstance(50, collections.abc.Sequence)
False

注意:isinstance也支持类元组,检查类型(x)在(…)是应该避免的,也是不必要的。

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

正如@2080所指出的,这对numpy数组无效。如。

>>> import collections.abc
>>> import numpy as np
>>> isinstance((1, 2, 3), collections.abc.Sequence)
True
>>> isinstance(np.array([1, 2, 3]), collections.abc.Sequence)
False

在这种情况下,您可以尝试来自@jpaddison3的答案:

>>> hasattr(np.array([1, 2, 3]), "__len__")
True
>>> hasattr([1, 2, 3], "__len__")
True
>>> hasattr((1, 2, 3), "__len__")
True

然而,正如这里所指出的,这也不是完美的,并且会错误地(至少在我看来)将字典分类为序列,而isinstance with collections.abc.Sequence则正确地分类:

>>> hasattr({"a": 1}, "__len__")
True
>>> from numpy.distutils.misc_util import is_sequence
>>> is_sequence({"a": 1})
True
>>> isinstance({"a": 1}, collections.abc.Sequence)
False

你可以这样定制你的解决方案,根据你的需要给isinstance添加更多类型:

>>> isinstance(np.array([1, 2, 3]), (collections.abc.Sequence, np.ndarray))
True
>>> isinstance([1, 2, 3], (collections.abc.Sequence, np.ndarray))
True

Preds_test[0]的形状(128,128,1) 让我们使用isinstance()函数检查它的数据类型 Isinstance接受2个参数。 第一个参数是数据 第二个参数是数据类型 isinstance(preds_test[0], np.ndarray)输出为True。这意味着preds_test[0]是一个数组。

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

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

N = [2,3,5]
P = 5

type(N).__name__ == 'list'
True

type(P).__name__ == 'int'
True

type(N).__name__ in ('list', 'tuple')
True

不需要进口任何东西。

我很惊讶,这样一个基本的问题在python中似乎没有一个直接的答案。 在我看来,几乎所有提出的答案都使用了某种类型 检查,在python中通常不建议这样做,它们似乎仅限于特定的情况(它们失败于不同的数值类型或非元组或列表的泛型可迭代对象)。

对我来说,更好的方法是导入numpy并使用array。尺寸,例如:

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

but:

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