Как определить, является ли число любым типом int (core или numpy, подписанным или нет)?

Мне нужно проверить, имеет ли переменная тип int или любой из np.int*, np.uint*, предпочтительно используя одно условие (т.е. no or).

После некоторых тестов я предполагаю, что:

  • isinstance(n, int) будет соответствовать только int и np.int32 (или np.int64 в зависимости от формы пластины),
  • np.issubdtype(type(n), int) похоже, соответствует всем int и np.int*, но не соответствует np.uint*.

Это приводит к двум вопросам: будет ли np.issubdtype соответствовать любому типу подписанных ints? Можно определить в одной проверке, является ли число любым типом подписанного или unsigned int?

Это о тестировании целых чисел, тест должен возвращать False для float-like.

Ответ 1

NumPy предоставляет базовые классы, которые вы можете/должны использовать для проверки подтипов, а не типы Python.

Используйте np.integer для проверки любого экземпляра любых подписанных или беззнаковых целых чисел.

Используйте np.signedinteger и np.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, потому что Python int является подписанным типом.

Полезная ссылка, показывающая взаимосвязь между всеми этими базовыми классами, содержится в документации здесь.

введите описание изображения здесь

Ответ 2

Я предлагаю передать кортеж типов в встроенную функцию python isinstance(). Что касается вашего вопроса о np.issubtype(), он не соответствует никаким типам подписанных ints, он определяет, является ли класс подклассом второго класса. И поскольку все целые типы (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