How to determine if a number is any type of int (core or numpy, signed or not)?
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
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.
I suggest passing a tuple of types to python isinstance()
built-in function. And regarding to your question about np.issubtype()
it doesn't match any kind of signed ints, it determine if a class is a subclass of a second class. And since all of integer types (int8, int32, etc.) are subclasses of int
it will return True if you pass any of these type along with int
.
Here is an example:
>>> 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
Also, as a more generic approach (is not appropriate when you only want to match some specific types) you can use 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