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

Как проверить, является ли numpy dtype интегральным?

Как проверить, является ли numpy dtype интегральным? Я пробовал:

issubclass(np.int64, numbers.Integral)

но он дает False.


Обновление: теперь он дает True.

4b9b3361

Ответ 1

У Numpy есть иерархия типов, похожих на иерархию классов (у скалярных типов действительно есть иерархия класса bona fide, которая отражает иерархию dtype). Вы можете использовать np.issubdtype(some_dtype, np.integer), чтобы проверить, является ли dtype целочисленным dtype. Обратите внимание, что, подобно большинству dtype-потребляющих функций, np.issubdtype() преобразует свои аргументы в dtypes, поэтому можно использовать все, что может сделать dtype с помощью конструктора np.dtype().

http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html#specifying-and-constructing-data-types

>>> import numpy as np
>>> np.issubdtype(np.int32, np.integer)
True
>>> np.issubdtype(np.float32, np.integer)
False
>>> np.issubdtype(np.complex64, np.integer)
False
>>> np.issubdtype(np.uint8, np.integer)
True
>>> np.issubdtype(np.bool, np.integer)
False
>>> np.issubdtype(np.void, np.integer)
False

В будущей версии numpy мы будем следить за тем, чтобы скалярные типы регистрировались соответствующими ABC numbers.

Ответ 2

Обратите внимание, что np.int64 не dtype, это тип Python. Если у вас есть фактический тип dtype (доступ к которому осуществляется через поле dtype массива), вы можете использовать np.typecodes вами np.typecodes:

my_array.dtype.char in np.typecodes['AllInteger']

Если у вас есть только такой тип, как np.int64, вы можете сначала получить dtype, соответствующий типу, а затем запросить его, как указано выше:

>>> np.dtype(np.int64).char in np.typecodes['AllInteger']
True

Ответ 3

Исходя из предыдущих ответов и комментариев, я решил использовать атрибут type объекта dtype с помощью встроенного метода issubclass() Python и модуля numbers:

import numbers
import numpy

assert issubclass(numpy.dtype('int32').type, numbers.Integral)
assert not issubclass(numpy.dtype('float32').type, numbers.Integral)

Ответ 4

Вы имеете в виду строку 17?

In [13]:

import numpy as np
A=np.array([1,2,3])
In [14]:

A.dtype
Out[14]:
dtype('int32')
In [15]:

isinstance(A, np.ndarray) #A is not an instance of int32, it is an instance of ndarray
Out[15]:
True
In [16]:

A.dtype==np.int32 #but its dtype is int32
Out[16]:
True
In [17]:

issubclass(np.int32, int) #and int32 is a subclass of int
Out[17]:
True

Ответ 5

В зависимости от варианта использования ducktyping

import operator
int = operator.index(number)

- хороший метод, на мой взгляд. Кроме того, ему не нужно ничего определенного.

Единственный недостаток заключается в том, что в некоторых случаях вам придется try/except его.

Ответ 6

Это не очень some_dtype ответ, но один из способов проверить, является ли класс some_dtype целочисленным dtype (например, np.int32), - вызвать его и np.int32 к строке:

str(dtype()) == '0'

Вместо этого dtypes с плавающей точкой дают 0.0.