检查 numpy 数组中的类型

新手上路,请多包涵

我有不同类型的数据。他们中的大多数是 int 有时是 floatint 大小不同,因此大小为 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])

对于那里 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

cd 当我问的时候是真的

isinstance(c, np.ndarray)
True
isinstance(d, np.ndarray)
True

我可以检查 ndarray 中的步骤

isinstance(c[i][j], np.float64)
True
isinstance(d[i], np.int32)
True

但这意味着我必须为每个维度添加一个新索引,否则它又是 False 。我可以检查那里的类型 dtype 就像 c.dtype == 'float64'

好的,对于我所发现和尝试的东西……我的问题基本上是:

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

原文由 Jan-Bert 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
2 个回答

数组是类型为 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

(并且 c[0].dtype c.dtype ;您不需要索引数组的各个元素来检查它们的数据类型)。

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

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

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

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

列表包含指向 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)

例如将所有 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'}

它可用于检查整数:

 if x0.dtype.kind in np.typecodes["AllInteger"]:
    x0 = np.asarray(x0, dtype=float)

原文由 hpaulj 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 rasen58 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进