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

Как узнать, содержит ли массив numpy целые числа?

Я знаю, что есть простое решение для этого, но, похоже, не может найти его на данный момент.

Учитывая массив numpy, мне нужно знать, содержит ли массив целые числа.

Проверка dtype per-se недостаточна, так как существует несколько int dtypes (int8, int16, int32, int64...).

4b9b3361

Ответ 1

Найденный в numpy book! Страница 23:

Другие типы в иерархии определяют определенные категории типов. Эти категории могут быть полезны для проверки того, является ли объект Возвращаемый self.dtype.type относится к определенному классу (с использованием issubclass).

issubclass(n.dtype('int8').type, n.integer)
>>> True
issubclass(n.dtype('int16').type, n.integer)
>>> True

Ответ 2

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

Ответ 3

Это также работает:

  n.dtype('int8').kind == 'i'

Ответ 4

Функция Numpy issubdtype() может использоваться следующим образом:

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

PS. Имейте в виду, что элементы массива всегда имеют один и тот же тип данных.

Ответ 5

Пока принятый ответ от 2009 года остается в силе, есть новое и расширенное решение от Numpy v0.19, выпущенного в сентябре 2014 года:

Все числовые типы numpy теперь регистрируются с помощью иерархии типов в модуле чисел python.

Это позволяет проверить dtype на Python Числовые абстрактные базовые классы.

isinstance(np.dtype('int8'), numbers.Integral)
issubclass(np.dtype('int32').type, numbers.Integral)

Вы можете протестировать против numbers.Complex, numbers.Real и numbers.Integral.

P.S. Поскольку вам больше не нужно обращаться к .type, вы можете сократить свою строку на несколько символов.;)