如何确定数字是否为任何类型的int(核心或numpy,带符号或不带符号)?


70

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

经过一些测试,我猜想:

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

这导致两个问题:将 np.issubdtype匹配任何一种带符号的整数?可以一次检查数字是否为带符号的整数或无符号的整数吗?

这是关于整数的测试,测试应返回False浮点型。

Answers:


104

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

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

np.issubdtype(np.uint*, int)永远是False因为Pythonint是带符号的类型。

这里的文档中找到了显示所有这些基类之间关系的有用参考。

在此处输入图片说明


31
我绝对会投票支持,这允许使用进行测试isinstance(n, (int, np.integer))
Arcturus B

1
@ArcturusB:我对您的评论感到困惑,因为我对这两种说法均得出False:isinstance(np.array(1, dtype=np.int32), np.int32)isinstance(np.array(1, dtype=np.int32), np.integer)
主角

1
@ArcturusB,您正在针对整数类型测试数组,因此您得到False结果。尝试isinstance(np.int32(1), np.int32)
sammywemmy

我觉得很奇怪,那np.issubdtype( int, np.integer )就是True:int可以在内存中使用,只要出现,就会 np.integer( sys.maxsize ** 2 )引发OverflowError:Python int太大而无法转换为C long。
丹尼斯

5

我建议将一个类型的元组传递给pythonisinstance()内置函数。关于您的问题np.issubtype()是否与任何带符号的int类型都不匹配,它确定一个类是否是第二个类的子类。并且由于所有整数类型(int8,int32等)都是其子类,int如果您将这些类型中的任何一个与一起传递,则它将返回True 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

另外,作为一种更通用的方法(当您只想匹配某些特定类型时不合适),可以使用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

感谢您对的澄清np.issutype()。我想列出中的类型isinstance()会起作用,但是我想避免这样做,因为它暗示这样做isinstance(n, (int, np.int, np.int0, np.int8, np.int16, <etc.>, np.uint, <etc.>)。我想不出pythonic。
Arcturus B'6

@ArcturusB在这种情况下,您可能想使用更通用的类型以及整数的父类型。看看numpy数据键入docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html
Kasravnd

实际上,np.integer按照ajcr的建议使用是可以的。谢谢!
Arcturus B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.