检查numpy数组中的类型

Jan*_*ert 5 numpy isinstance python-3.x

我有不同类型的数据.他们中的大多数是int,有时float.它的int大小不同,因此8/16/32位是大小.
对于这种情况,我正在创建一个数字型转换器.因此我通过使用检查类型isinstence().这是因为我读过的isinstance()内容不如说type().

关键是我得到的很多数据都是numpy数组.我使用spyder作为IDE,然后我看到变量也是一个类型.但是当我输入isinstance(var,'type i read')我的时候False.

我做了一些检查:

a = 2.17 
b = 3 
c = np.array(np.random.rand(2, 8))
d = np.array([1])
Run Code Online (Sandbox Code Playgroud)

因为isinstance(var,type)我得到:

isinstance(a, float)
True
isinstance(b, int)
True
isinstance(c, float)  # or isinstance(c, np.float64)
False
isinstance(d, int)  # or isinstance(c, np.int32)
False
Run Code Online (Sandbox Code Playgroud)

c并且d是真实的,当我问

isinstance(c, np.ndarray)
True
isinstance(d, np.ndarray)
True
Run Code Online (Sandbox Code Playgroud)

我可以与在步骤检查ndarray

isinstance(c[i][j], np.float64)
True
isinstance(d[i], np.int32)
True
Run Code Online (Sandbox Code Playgroud)

但这意味着,对于每个维度,我必须添加一个新索引,否则它将False再次出现.我可以检查有型有dtypec.dtype == 'float64'...

为了我所找到和尝试过的东西,所以...我的问题基本上是:

  • var.dtype方法与(isinstance()type()最差/更好等)相比如何?
  • 如果没有所有的手动索引,有没有var.dtype更糟糕的isinstance()方法isinstance()?(自动索引等)?

hpa*_*ulj 7

数组是类型的对象np.ndarray.它的值或元素存储在数据缓冲区中,可以将其视为连续的内存字节块.数据缓冲区中的字节没有类型,因为它们不是Python对象.

该数组有一个dtype参数,用于解释这些字节.如果dtypeint32(有各种同义词),则4个字节被解释为整数.访问一个元素,比如c[0]给出一个取决于dtype的新对象,例如对象类型np.int32.

c[0].item 将给出相应类型的Python对象:

In [2102]: c=np.array([1])
In [2103]: c.dtype
Out[2103]: dtype('int32')
In [2104]: type(c)
Out[2104]: numpy.ndarray
In [2105]: type(c[0])
Out[2105]: numpy.int32
In [2107]: c[0].item()
Out[2107]: 1
In [2108]: type(c[0].item())
Out[2108]: int
Run Code Online (Sandbox Code Playgroud)

(并且与之c[0].dtype相同c.dtype;您不需要索引数组的各个元素来检查它们的dtype).

该数组的相同4个字节可视为dtype int8- 单字节整数.

In [2112]: c.view('b')
Out[2112]: array([1, 0, 0, 0], dtype=int8)
Run Code Online (Sandbox Code Playgroud)

这个备用视图的一个元素是np.int8,但是当我接受时item(),我得到一个Python整数.没有int8Python数字类型.

In [2113]: type(c.view('b')[0])
Out[2113]: numpy.int8
In [2115]: type(c.view('b')[0].item())
Out[2115]: int
Run Code Online (Sandbox Code Playgroud)

列表包含指向Python对象的指针,每个对象都有一个类型.一阵一阵dtype=object.但是常见的数字数组不包含Python整数或浮点数.它有一个数据缓冲区,可以根据不同的方式进行解释dtype.Python整数的大小不同,至少与numpy dtypes的大小不同.

所以这些isinstancetype()东西不适用于.的内容ndarray.

====================

从我收集的评论中,您试图将整数数组转换为浮点数.你没有转换标量.如果是这样,那么重要的dtype是什么; 一个数组总是有一个dtype.目前还不清楚你是否可以np.float32选择np.float64.

我建议学习,并尝试np.can_cast功能和x.astype方法.

x.astype(np.float64, copy=False)
Run Code Online (Sandbox Code Playgroud)

例如,将所有int dtypes转换为float,而不复制已经是float64的那些.它可以复制和转换np.float32.

另请参阅casting这些函数的参数.

===========================

我在scipy.optimize.minimize另一个测试工具中找到了

In [156]: np.typecodes
Out[156]: 
{'All': '?bhilqpBHILQPefdgFDGSUVOMm',
 'AllFloat': 'efdgFDG',
 'AllInteger': 'bBhHiIlLqQpP',
 'Character': 'c',
 'Complex': 'FDG',
 'Datetime': 'Mm',
 'Float': 'efdg',
 'Integer': 'bhilqp',
 'UnsignedInteger': 'BHILQP'}
Run Code Online (Sandbox Code Playgroud)

它可用于检查整数:

if x0.dtype.kind in np.typecodes["AllInteger"]:
    x0 = np.asarray(x0, dtype=float)
Run Code Online (Sandbox Code Playgroud)


ras*_*n58 5

要直接回答问题,您可以这样做:

isinstance(arr.flat[0], np.floating)

  • .flat 将折叠任意数量的维度,因此您可以轻松访问第 0 个元素。
  • np.floating 将匹配任何 numpy 浮点类型

  • 这假设数组*有*第一个元素。可能不是——数组可以有 0 个元素。这完全不如数据类型检查。 (2认同)

小智 5

与 @rasen58 和 @hpaulj 略有不同:

要检查 np 数组是否c具有 float 类型的元素,c.dtype == np.floating对我有用。

  • FWIW,当我尝试这个时,我得到 `/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:79: DeprecationWarning: Converting 'np.inexact' or 'np.floating' to a dtype is deprecated。当前结果是“float64”,这并不严格正确。 (2认同)