Как узнать, содержит ли массив numpy целые числа?
Вопрос
Я знаю, что есть простое решение этой проблемы, но сейчас не могу его найти.
Учитывая массив numpy, мне нужно знать, содержит ли массив целые числа.
Проверки dtype как таковой недостаточно, поскольку существует несколько типов int (int8, int16, int32, int64...).
Решение
Нашел это в пустая книга!Страница 23:
Остальные типы в иерархии определяют отдельные категории типов.Эти категории могут быть полезны для тестирования, является ли объект, возвращаемый Self.Dtype.Type, имеет конкретный класс (с использованием IssubClass).
issubclass(n.dtype('int8').type, n.integer)
>>> True
issubclass(n.dtype('int16').type, n.integer)
>>> True
Другие советы
Проверка целочисленного типа не работает для чисел с плавающей запятой, которые являются целыми числами, например. 4.
Лучшее решение np.equal(np.mod(x, 1), 0)
, как в:
>>> import numpy as np
>>> def isinteger(x):
... return np.equal(np.mod(x, 1), 0)
...
>>> foo = np.array([0., 1.5, 1.])
>>> bar = np.array([-5, 1, 2, 3, -4, -2, 0, 1, 0, 0, -1, 1])
>>> isinteger(foo)
array([ True, False, True], dtype=bool)
>>> isinteger(bar)
array([ True, True, True, True, True, True, True, True, True,
True, True, True], dtype=bool)
>>> isinteger(1.5)
False
>>> isinteger(1.)
True
>>> isinteger(1)
True
Это также работает:
n.dtype('int8').kind == 'i'
Функцию issubdtype() в Numpy можно использовать следующим образом:
import numpy as np
size=(3,3)
A = np.random.randint(0, 255, size)
B = np.random.random(size)
print 'Array A:\n', A
print 'Integers:', np.issubdtype(A[0,0], int)
print 'Floats:', np.issubdtype(A[0,0], float)
print '\nArray B:\n', B
print 'Integers:', np.issubdtype(B[0,0], int)
print 'Floats:', np.issubdtype(B[0,0], float)
Полученные результаты:
Array A:
[[ 9 224 33]
[210 117 83]
[206 139 60]]
Integers: True
Floats: False
Array B:
[[ 0.54221849 0.96021118 0.72322367]
[ 0.02207826 0.55162813 0.52167972]
[ 0.74106348 0.72457807 0.9705301 ]]
Integers: False
Floats: True
ПС.Имейте в виду, что элементы массива всегда имеют один и тот же тип данных.
Пока принятый ответ от 2009 года все еще действителен, есть новое и улучшенное решение начиная с Numpy v0.19, выпущенного в сентябре 2014 г.:
Все числовые типы numpy теперь регистрируются в иерархии типов в модуле Python Numbers.
Это позволяет проверить dtype
против Python Числовые абстрактные базовые классы.
isinstance(np.dtype('int8'), numbers.Integral)
issubclass(np.dtype('int32').type, numbers.Integral)
Вы можете протестировать против numbers.Complex
, numbers.Real
и numbers.Integral
.
P.S. Поскольку вам не нужен доступ .type
теперь вы можете сократить строку на несколько символов.;)