如何检查numpy dtype是否是完整的?

Nei*_*l G 28 python integer numpy abc

如何检查numpy dtype是否是完整的?我试过了:

issubclass(np.int64, numbers.Integral)
Run Code Online (Sandbox Code Playgroud)

但它给了False.


更新:它现在给出True.

Rob*_*ern 45

Numpy具有类似于类层次结构的dtypes层次结构(标量类型实际上具有反映dtype层次结构的真正的类层次结构).您可以np.issubdtype(some_dtype, np.integer)用来测试dtype是否为整数dtype.请注意,与大多数消耗np.issubdtype()dtype的函数一样,将其参数转换为dtypes,因此可以使用任何可以通过np.dtype()构造函数生成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
Run Code Online (Sandbox Code Playgroud)

在numpy的未来版本中,我们将确保标量类型在适当的numbersABC 中注册.

  • 为了跟进,[即将推出的numpy 1.9](https://github.com/numpy/numpy/pull/4547)将使用`numbers` ABCs注册标量类型,以便`issubclass(np.int32,numbers.Integral) )``会工作,感谢[Martin Teichmann](https://github.com/tecki). (3认同)

use*_*342 14

请注意,这np.int64不是dtype,而是Python类型.如果你有一个实际的dtype(通过dtype数组的字段访问),你可以使用np.typecodes你发现的字典:

my_array.dtype.char in np.typecodes['AllInteger']
Run Code Online (Sandbox Code Playgroud)

如果您只有类型np.int64的类型,则可以先获取与该类型对应的dtype,然后按上述方式查询:

>>> np.dtype(np.int64).char in np.typecodes['AllInteger']
True
Run Code Online (Sandbox Code Playgroud)


Nei*_*l G 10

自从提出这个问题以来,NumPy 添加了适当的注册numbers,所以这有效:

issubclass(np.int64, numbers.Integral)
issubclass(np.int64, numbers.Real)
issubclass(np.int64, numbers.Complex)
Run Code Online (Sandbox Code Playgroud)

这比深入研究更深奥的 NumPy 界面更优雅。

要对 dtype 实例执行此检查,请使用其.type属性:

issubclass(array.dtype.type, numbers.Integral)
issubclass(array.dtype.type, numbers.Real)
issubclass(array.dtype.type, numbers.Complex)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ann 7

基于以前的答案和评论,我已经决定typedtype对象的属性与 Python 的内置issubclass()方法和numbers模块一起使用:

import numbers
import numpy

assert issubclass(numpy.dtype('int32').type, numbers.Integral)
assert not issubclass(numpy.dtype('float32').type, numbers.Integral)
Run Code Online (Sandbox Code Playgroud)