如何确定一个数字是否是任何类型的int(核心或numpy,是否签名)?

Arc*_*s B 41 python types numpy

我需要测试变量是否为类型的int,或任何的np.int*,np.uint*优选使用单一的条件(没有or).

经过一些测试,我想:

  • isinstance(n, int)只会匹配intnp.int32(或np.int64取决于平台),
  • np.issubdtype(type(n), int)似乎所有的匹配intnp.int*,但不匹配np.uint*.

这导致两个问题:是否会np.issubdtype匹配任何类型的签名?可以在单个检查中确定一个数字是否是任何种类的有符号或无符号的int?

这是关于测试整数,测试应返回False浮动喜欢.

Ale*_*ley 58

NumPy提供了可以/应该用于子类型检查的基类,而不是Python类型.

使用np.integer检查符号或无符号整数的任何实例.

使用np.signedintegernp.unsignedinteger检查签名类型或无符号类型.

>>> np.issubdtype(np.uint32, np.integer)
True
>>> np.issubdtype(np.uint32, np.signedinteger)
False
>>> np.issubdtype(int, np.integer)
True
Run Code Online (Sandbox Code Playgroud)

测试时,所有浮动或复数类型都将返回False.

np.issubdtype(np.uint*, int)永远是False因为Python int是签名类型.

显示所有这些基类之间关系的有用参考资料可在此处的文档中找到.

在此输入图像描述

  • 我肯定会投票,这允许使用:`isinstance(n,(int,np.integer))`进行测试. (21认同)
  • @ArcturusB:我对你的评论感到困惑,因为这两个语句我都得到 False:`isinstance(np.array(1, dtype=np.int32), np.int32)` 和 `isinstance(np.array(1) , dtype=np.int32), np.integer)` (2认同)

Kas*_*mvd 7

我建议将类型元组传递给 pythonisinstance()内置函数。关于您关于np.issubtype()它的问题与任何类型的有符号整数都不匹配,它确定一个类是否是第二个类的子类。由于所有整数类型(int8、int32 等)都是int它的子类,如果您将这些类型中的任何一个与int.

下面是一个例子:

>>> a = np.array([100])
>>> 
>>> np.issubdtype(type(a[0]), int)
True
>>> isinstance(a[0], (int, np.uint))
True
>>> b = np.array([100], dtype=uint64)
>>> 
>>> isinstance(b[0], (int, np.uint))
True
Run Code Online (Sandbox Code Playgroud)

此外,作为更通用的方法(当您只想匹配某些特定类型时不合适),您可以使用np.isreal()

>>> np.isreal(a[0])
True
>>> np.isreal(b[0])
True
>>> np.isreal(2.4) # This might not be the result you want
True
>>> np.isreal(2.4j)
False
Run Code Online (Sandbox Code Playgroud)