44

我知道有一个简单的解决方案,但目前似乎找不到。

给定一个 numpy 数组,我需要知道该数组是否包含整数。

检查 dtype 本身是不够的,因为有多个 int dtype(int8、int16、int32、int64 ...)。

4

6 回答 6

52

numpy 书中找到它!第 23 页:

层次结构中的其他类型定义了特定的类型类别。这些类别可用于测试 self.dtype.type 返回的对象是否属于特定类(使用 issubclass)。

issubclass(n.dtype('int8').type, n.integer)
>>> True
issubclass(n.dtype('int16').type, n.integer)
>>> True
于 2009-06-01T12:39:12.987 回答
27

检查整数类型不适用于整数浮点数,例如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
于 2011-08-29T22:34:52.533 回答
9

这也有效:

  n.dtype('int8').kind == 'i'
于 2009-07-22T22:52:30.763 回答
7

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。请记住,数组的元素始终具有相同的数据类型。

于 2016-03-24T15:12:23.373 回答
2

虽然2009 年接受的答案仍然有效,但从 2014 年 9 月发布的 Numpy v0.19 开始,有一个新的增强解决方案:

现在,所有数字 numpy 类型都在 python numbers 模块中的类型层次结构中注册。

这允许dtype对照 Python 的Numeric abstract base classes检查。

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

您可以针对numbers.Complexnumbers.Real进行测试numbers.Integral

PS由于您不再需要访问.type,您现在可以将行缩短几个字符。;)

于 2017-04-20T23:36:28.890 回答
0

如果您正在寻找确定 dtype 是否是完整的,那么您可以按照其他答案的建议查看类型层次结构。但是,如果您想检查可能包含整数的浮点数,您可以使用(x % 1) == 0,或者我最近为此目的编写的 ufunc:https ://github.com/madphysicist/is_integer_ufunc 。安装后,你可以运行它

from is_integer_ufunc import is_integer

is_integer(x)

它同样适用于整数和浮点类型。返回值是一个掩码。对于整数类型,它始终为 True,而对于浮点数,它表示包含整数值的元素。

于 2021-12-31T01:31:19.603 回答