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

As you see, I can’t apply len to P , since it’s not an array…. Is there something like isarray or isscalar 在python中?

谢谢

原文由 otmezger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 374
2 个回答
>>> import collections.abc
>>> isinstance([0, 10, 20, 30], collections.abc.Sequence)
True
>>> isinstance(50, collections.abc.Sequence)
False

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

您可能还想检查 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

但是,正如 此处 所述,这也不是完美的,并且会错误地将字典(至少根据我)分类为序列,而 isinstancecollections.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

原文由 jamylak 发布,翻译遵循 CC BY-SA 4.0 许可协议

以前的答案假设数组是 python 标准列表。作为经常使用 numpy 的人,我推荐一个非常 pythonic 的测试:

 if hasattr(N, "__len__")

原文由 jpaddison3 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题