Fix Python – How to determine if a number is any type of int (core or numpy, signed or not)?

Question

Asked By – Arcturus B

I need to test whether a variable is of type int, or any of np.int*, np.uint*, preferably using a single condition (i.e. no or).

After some tests, I guess that:

  • isinstance(n, int) will only match int and np.int32 (or np.int64 depending on plateform),
  • np.issubdtype(type(n), int) seems to match all int and np.int*, but doesn’t match np.uint*.

This leads to two questions: will np.issubdtype match any kind of signed ints? Can determine in a single check whether a number is any kind of signed or unsigned int?

This is about testing for integers, the test should return False for float-likes.

Now we will see solution for issue: How to determine if a number is any type of int (core or numpy, signed or not)?


Answer

NumPy provides base classes that you can/should use for subtype-checking, rather than the Python types.

Use np.integer to check for any instance of either signed or unsigned integers.

Use np.signedinteger and np.unsignedinteger to check for signed types or unsigned types.

>>> np.issubdtype(np.uint32, np.integer)
True
>>> np.issubdtype(np.uint32, np.signedinteger)
False
>>> np.issubdtype(int, np.integer)
True
>>> np.issubdtype(np.array([1, 2, 3]).dtype, np.integer)
True

All floating or complex number types will return False when tested.

np.issubdtype(np.uint*, int) will always be False because the Python int is a signed type.

A useful reference showing the relationship between all of these base classes is found in the documentation here.

enter image description here

This question is answered By – Alex Riley

This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0