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

StackOverflow https://stackoverflow.com/questions/934616

  •  06-09-2019
  •  | 
  •  

Вопрос

Я знаю, что есть простое решение этой проблемы, но сейчас не могу его найти.

Учитывая массив 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 теперь вы можете сократить строку на несколько символов.;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top