otm*_*ger 258 python arrays variables scalar
我有一个接受参数的函数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()
>>>
Run Code Online (Sandbox Code Playgroud)
正如你看到的,我不能申请len
到P
,因为它不是一个数组....有什么样isarray
或isscalar
在Python?
谢谢
jam*_*lak 347
>>> isinstance([0, 10, 20, 30], list)
True
>>> isinstance(50, list)
False
Run Code Online (Sandbox Code Playgroud)
要支持任何类型的序列,请检查collections.Sequence
而不是list
.
注意:isinstance
还支持一个类的元组,type(x) in (..., ...)
应该避免检查并且是不必要的.
你可能还想检查一下 not isinstance(x, (str, unicode))
jpa*_*on3 111
以前的答案假设该数组是python标准列表.作为经常使用numpy的人,我推荐一个非常pythonic测试:
if hasattr(N, "__len__")
Run Code Online (Sandbox Code Playgroud)
sco*_*owe 39
将@jamylak和@jpaddison3的答案结合在一起,如果你需要对numpy数组作为输入强大并以与列表相同的方式处理它们,你应该使用
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Run Code Online (Sandbox Code Playgroud)
这对list,tuple和numpy数组的子类很有用.
如果你想要对所有其他序列子类(不仅仅是列表和元组)具有健壮性,请使用
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Run Code Online (Sandbox Code Playgroud)
为什么要用这种方式做事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
Run Code Online (Sandbox Code Playgroud)
尽管x
和y
比较相同,处理它们type
会导致不同的行为.然而,由于x
是的子类的实例list
,使用isinstance(x,list)
得到所需的行为和治疗x
和y
以相同的方式.
jmh*_*mhl 30
numpy中是否有等同于isscalar()的东西?是.
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
Run Code Online (Sandbox Code Playgroud)
Suk*_*lra 17
虽然@ jamylak的方法更好,但这是一种替代方法
>>> N=[2,3,5]
>>> P = 5
>>> type(P) in (tuple, list)
False
>>> type(N) in (tuple, list)
True
Run Code Online (Sandbox Code Playgroud)
另一种替代方法(使用类名属性):
N = [2,3,5]
P = 5
type(N).__name__ == 'list'
True
type(P).__name__ == 'int'
True
type(N).__name__ in ('list', 'tuple')
True
Run Code Online (Sandbox Code Playgroud)
无需导入任何东西。
这是我发现的最好方法:检查__len__
和的存在__getitem__
。
你可能会问为什么?原因包括:
isinstance(obj, abc.Sequence)
在包括 PyTorch 的 Tensor 在内的某些对象上失败,因为它们没有实现__contains__
.__len__
,__getitem__
我认为这是类似数组对象的最小方法。言归正传:
def is_array_like(obj, string_is_array=False, tuple_is_array=True):
result = hasattr(obj, "__len__") and hasattr(obj, '__getitem__')
if result and not string_is_array and isinstance(obj, (str, abc.ByteString)):
result = False
if result and not tuple_is_array and isinstance(obj, tuple):
result = False
return result
Run Code Online (Sandbox Code Playgroud)
请注意,我添加了默认参数,因为大多数时候您可能希望将字符串视为值,而不是数组。对于元组也是如此。