python:如何识别变量是数组还是s

2024-04-26 20:53:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个接受参数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中是否有类似于isarrayisscalar的内容?

谢谢


Tags: 函数most参数lenstdin数组call向量
3条回答

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

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

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

如果您还想对序列的所有其他子类(不仅仅是列表和元组)保持健壮性,请使用

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

尽管xy比较相等,但通过type处理它们会导致不同的行为。然而,由于xlist的一个子类的实例,因此使用isinstance(x,list)可以提供所需的行为,并以相同的方式对待xy

前面的答案假设数组是python标准列表。作为一个经常使用numpy的人,我建议你做一个非常像Python的测试:

if hasattr(N, "__len__")
>>> isinstance([0, 10, 20, 30], list)
True
>>> isinstance(50, list)
False

要支持任何类型的序列,请选中collections.Sequence,而不是list

注意isinstance也支持类的元组,应该避免检查type(x) in (..., ...),这是不必要的。

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

相关问题 更多 >