Подтвердить что ты не робот

Как определить, является ли число любым типом 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.

4b9b3361

Ответ 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