Как проверить, является ли numpy dtype интегральным? Я пробовал:
issubclass(np.int64, numbers.Integral)
но он дает False
.
Обновление: теперь он дает True
.
Как проверить, является ли numpy dtype интегральным? Я пробовал:
issubclass(np.int64, numbers.Integral)
но он дает False
.
Обновление: теперь он дает True
.
У 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
.
Обратите внимание, что 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
Исходя из предыдущих ответов и комментариев, я решил использовать атрибут 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)
Вы имеете в виду строку 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
В зависимости от варианта использования ducktyping
import operator
int = operator.index(number)
- хороший метод, на мой взгляд. Кроме того, ему не нужно ничего определенного.
Единственный недостаток заключается в том, что в некоторых случаях вам придется try
/except
его.
Это не очень some_dtype
ответ, но один из способов проверить, является ли класс some_dtype
целочисленным dtype (например, np.int32
), - вызвать его и np.int32
к строке:
str(dtype()) == '0'
Вместо этого dtypes с плавающей точкой дают 0.0
.