NumPy 之: 数据类型对象 dtype
简介
之前讲到了 NumPy 中有多种数据类型,每种数据类型都是一个 dtype(numpy.dtype )对象。今天我们来详细讲解一下 dtype 对象。
dtype 的定义
先看下 dtype 方法的定义:
其作用就是将对象 obj 转成 dtype 类型的对象。
它带了两个可选的参数:
align – 是否按照 C 编译器的结构体输出格式对齐对象。
Copy – 是拷贝对象,还是对对象的引用。
dtype 可以用来描述数据的类型(int,float,Python 对象等),描述数据的大小,数据的字节顺序(小端或大端)等。
可转换为 dtype 的对象
可转换的 obj 对象可以有很多种类型,我们一一来进行讲解
dtype 对象
如果 obj 对象本身就是一个 dtype 对象,那么可以进行无缝转换。
None
不传的话,默认就是float_
,这也是为什么我们创建数组默认都是 float 类型的原因。
数组标量类型
内置的数组标量可以被转换成为相关的 data-type 对象。
前面一篇文章我们讲到了什么是数组标量类型。数组标量类型是可以通过 np.type 来访问的数据类型。 比如:
np.int32
,np.complex128
等。
我们看下数组标量的转换:
这些以 np 开头的内置数组标量类型可以参考我之前写的文章 “NumPy 之:数据类型” 。
注意,数组标量并不是 dtype 对象,虽然很多情况下,可以在需要使用 dtype 对象的时候都可以使用数组标量。
通用类型
一些通用类型对象,可以被转换成为相应的 dtype 类型:
内置 Python 类型
一些 Python 内置的类型和数组标量类型是等价的,也可以被转换成为 dtype:
看下内置 Python 类型转换的例子:
带有.dtype 属性的对象
任何 type 对象只要包含dtype
属性,并且这个属性属于可以转换的范围的话,都可以被转换成为 dtype。
一个字符的 string 对象
对于每个内置的数据类型来说都有一个和它对应的字符编码,我们也可以使用这些字符编码来进行转换:
数组类型的 String
Numpy 中数组类型的对象有一个属性叫做 typestr。
typestr 描述了这个数组中存放的数据类型和长度。
typestr 由三部分组成,第一部分是描述数据字节顺序: <
小端 >
大端。
第二部分是数组里面元素的基本类型:
最后一部分就是数据的长度。
dtype 支持下面几种类型的转换:
我们看几个例子:
逗号分割的字符串
逗号分割的字符串可以用来表示结构化的数据类型。
对于这种结构化的数据类型也可以转换成为 dtpye 格式,转换后的 dtype,将会以 f1,f2, … fn-1 作为名字来保存对应的格式数据。我们举个例子:
上面的例子中,f0 保存的是 32 位的整数,f1 保存的是 2 x 3 数组的 64-bit 浮点数。f2 是一个 32-bit 的浮点数。
再看另外一个例子:
类型字符串
所有在numpy.sctypeDict
.keys()中的字符,都可以被转换为 dtype:
使用的例子:
元组
通过使用 dtype 构成的元组,我们可以生成新的 dtype。
元组也有很多种方式。
(flexible_dtype, itemsize)
对于不固定长度的 dtype,可以指定 size:
(fixed_dtype, shape)
对于固定长度的 dtype,可以指定 shape:
[(field_name, field_dtype, field_shape), …]
list 中的元素是一个个的 field,每个 field 都是由 2-3 个部分组成的,分别是 field 名字,field 类型,field 的 shape。
field_name 如果是 ’ ‘的话,就会使用默认的 f1,f2 ….作为名字。field_name 也可以是一个 2 元组,由 title 和 name 组成。
field_dtype 就是 field 的 dtype 类型。
shape 是一个可选字段,如果 field_dtype 是一个数组的话,就需要指定 shape。
上面是两个字段,一个是大端的 32 位的 int,一个是小端的 32 位的 int。
四个字段,每个都是无符号整形。
{‘names’: …, ‘formats’: …, ‘offsets’: …, ‘titles’: …, ‘itemsize’: …}
这种写法可以指定 name 列表和 formats 列表:
offsets 指的是每个字段的 byte offsets。titles 是字段的 title,itemsize 是整个 dtype 的 size。
(base_dtype, new_dtype)
可以将基本的 dtype 类型转换为结构化的 dtype 类型:
32 位的 int 转换成两个 16 位的 int。
32 位的 int,转换成 4 个 unsigned integers。
本文已收录于 http://www.flydean.com/04-python-numpy-datatype-obj/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
版权声明: 本文为 InfoQ 作者【程序那些事】的原创文章。
原文链接:【http://xie.infoq.cn/article/a8ee9eac63b76598c8ad1887c】。文章转载请联系作者。
评论