gpt4 book ai didi

python-3.x - 检查 numpy 数组中的类型

转载 作者:行者123 更新时间:2023-12-03 01:19:20 25 4
gpt4 key购买 nike

我有不同类型的数据。其中大多数是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 当我询问时为 True

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'...

好吧,对于我所发现和尝试过的......我的问题基本上是:

  • isinstance()type() 相比,var.dtype 方法如何(最差/更好等)?
  • 如果 var.dtypeisinstance() 更糟糕,isinstance() 中是否有一些方法不需要所有手动索引? (自动索引等)?

最佳答案

数组是np.ndarray类型的对象。它的值或元素存储在数据缓冲区中,可以将其视为连续的内存字节 block 。数据缓冲区中的字节没有类型,因为它们不是 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].dtypec.dtype 相同;您不需要索引数组的各个元素来检查其 dtype )。

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

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

这个备用 View 的单个元素是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整数或 float 。它有一个数据缓冲区,可以根据dtype以各种方式解释。 Python 整数的大小没有不同,至少与 numpy 数据类型的大小不同。

因此,isinstancetype() 内容不适用于 ndarray 的内容。

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

根据我收集的评论,您正在尝试将整数数组转换为 float 。您没有转换标量。如果是这样,那么 dtype 才是最重要的;数组总是有一个dtype。目前尚不清楚您是否可以将 np.float32 转换为 np.float64

我建议学习并尝试 np.can_cast 函数和 x.astype 方法。

x.astype(np.float64, copy=False)
例如,

会将所有 int 数据类型转换为 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)

关于python-3.x - 检查 numpy 数组中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40312013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com