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