Как мне узнать, содержит ли массив numpy целые числа? - PullRequest
34 голосов
/ 01 июня 2009

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

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

Проверка самого dtype сама по себе недостаточна, так как существует несколько типов int (int8, int16, int32, int64 ...).

Ответы [ 5 ]

46 голосов
/ 01 июня 2009

Нашел его в numy book ! Страница 23:

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

issubclass(n.dtype('int8').type, n.integer)
>>> True
issubclass(n.dtype('int16').type, n.integer)
>>> True
19 голосов
/ 30 августа 2011

Проверка целочисленного типа не работает для целых чисел с плавающей точкой, например 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
7 голосов
/ 23 июля 2009

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

  n.dtype('int8').kind == 'i'
5 голосов
/ 21 апреля 2017

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

Все числовые числовые типы теперь зарегистрированы в иерархии типов. в модуле номеров 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, вы можете сократить свою строку на несколько символов. ;)

5 голосов
/ 24 марта 2016

Функция 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...