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再次出现.我可以检查有型有dtype样c.dtype == 'float64'...
为了我所找到和尝试过的东西,所以...我的问题基本上是:
var.dtype方法与(isinstance()和type()最差/更好等)相比如何?var.dtype更糟糕的isinstance()方法isinstance()?(自动索引等)?数组是类型的对象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
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的大小不同.
所以这些isinstance和type()东西不适用于.的内容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)
要直接回答问题,您可以这样做:
isinstance(arr.flat[0], np.floating)
.flat 将折叠任意数量的维度,因此您可以轻松访问第 0 个元素。np.floating 将匹配任何 numpy 浮点类型 小智 5
与 @rasen58 和 @hpaulj 略有不同:
要检查 np 数组是否c具有 float 类型的元素,c.dtype == np.floating对我有用。
| 归档时间: |
|
| 查看次数: |
11924 次 |
| 最近记录: |