检查 numpy 数组中的类型
check type within numpy array
我有不同类型的数据。他们中的大多数是 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])
在那里 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
c
和 d
当我问
时是真的
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()
中是否有一些方法没有所有手动索引? (自动索引等)?
numpy 数组中的所有条目都属于同一类型。 numpy 类型和 Python 类型不是一回事。这可能有点令人困惑,但 numpy 所指的类型更像是 C 等语言使用的类型 - 你可能会说更接近机器的低级别。
你不能说哪种更好,因为这就像比较苹果和橘子。
数组是 np.ndarray
类型的对象。它的值或元素存储在数据缓冲区中,可以将其视为连续的内存字节块。数据缓冲区中的字节没有类型,因为它们不是 Python 个对象。
数组有一个dtype
参数,用来解释那些字节。如果 dtype
是 int32
(有各种同义词),则 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 的大小不同。
因此 isinstance
和 type()
内容不适用于 ndarray
.
的内容
====================
根据我收集到的评论,您正在尝试将整数数组转换为浮点数。您不是在转换标量。如果是这样,那么 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)
要直接回答问题,您可以这样做:
isinstance(arr.flat[0], np.floating)
.flat
将向下折叠任意数量的维度,因此您可以轻松访问第 0 个元素。
np.floating
将匹配任何 numpy 浮点类型
我写了一个小包装器,它基本上像 isinstance
一样工作并接受一个对象 o
和一个 class (或 classes 的元组)c
.
唯一的区别是如果 isinstance(o, np.ndarray)
是 True
,o.flat[0]
是根据映射的 numpy 数据类型检查的(参见字典 c2np
)
我主要使用 bool
、int
、float
、str
,但此列表可以更改/扩展。
注意 np.integer
和 np.floating
是 most / all?可用的 numpy 子类型为 np.int8、np.unit16、...
def np_isinstance(o, c):
c2np = {bool: np.bool, int: np.integer, float: np.floating, str: np.str}
if isinstance(o, np.ndarray):
c = (c2np[cc] for cc in c) if isinstance(c, tuple) else c2np[c]
return isinstance(o.flat[0], c)
else:
return isinstance(o, c)
一些示例:
# Like isinstance if o is not np.ndarray
np_isinstance(('this', 'that'), tuple) # True
np_isinstance(4.4, int) # False
np_isinstance(4.4, float) # True
#
np_isinstance(np.ones(4, dtype=int), int) # True
np_isinstance(np.ones(4, dtype=int), float) # False
np_isinstance(np.full((4, 4), 'bert'), str) # True
与@rasen58 和@hpaulj 略有不同:
要检查 np 数组 c
是否包含浮点类型的元素,c.dtype == np.floating
适合我。
我有不同类型的数据。他们中的大多数是 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])
在那里 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
c
和 d
当我问
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()
中是否有一些方法没有所有手动索引? (自动索引等)?
numpy 数组中的所有条目都属于同一类型。 numpy 类型和 Python 类型不是一回事。这可能有点令人困惑,但 numpy 所指的类型更像是 C 等语言使用的类型 - 你可能会说更接近机器的低级别。
你不能说哪种更好,因为这就像比较苹果和橘子。
数组是 np.ndarray
类型的对象。它的值或元素存储在数据缓冲区中,可以将其视为连续的内存字节块。数据缓冲区中的字节没有类型,因为它们不是 Python 个对象。
数组有一个dtype
参数,用来解释那些字节。如果 dtype
是 int32
(有各种同义词),则 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 的大小不同。
因此 isinstance
和 type()
内容不适用于 ndarray
.
====================
根据我收集到的评论,您正在尝试将整数数组转换为浮点数。您不是在转换标量。如果是这样,那么 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)
要直接回答问题,您可以这样做:
isinstance(arr.flat[0], np.floating)
.flat
将向下折叠任意数量的维度,因此您可以轻松访问第 0 个元素。np.floating
将匹配任何 numpy 浮点类型
我写了一个小包装器,它基本上像 isinstance
一样工作并接受一个对象 o
和一个 class (或 classes 的元组)c
.
唯一的区别是如果 isinstance(o, np.ndarray)
是 True
,o.flat[0]
是根据映射的 numpy 数据类型检查的(参见字典 c2np
)
我主要使用 bool
、int
、float
、str
,但此列表可以更改/扩展。
注意 np.integer
和 np.floating
是 most / all?可用的 numpy 子类型为 np.int8、np.unit16、...
def np_isinstance(o, c):
c2np = {bool: np.bool, int: np.integer, float: np.floating, str: np.str}
if isinstance(o, np.ndarray):
c = (c2np[cc] for cc in c) if isinstance(c, tuple) else c2np[c]
return isinstance(o.flat[0], c)
else:
return isinstance(o, c)
一些示例:
# Like isinstance if o is not np.ndarray
np_isinstance(('this', 'that'), tuple) # True
np_isinstance(4.4, int) # False
np_isinstance(4.4, float) # True
#
np_isinstance(np.ones(4, dtype=int), int) # True
np_isinstance(np.ones(4, dtype=int), float) # False
np_isinstance(np.full((4, 4), 'bert'), str) # True
与@rasen58 和@hpaulj 略有不同:
要检查 np 数组 c
是否包含浮点类型的元素,c.dtype == np.floating
适合我。