1. 定义复合类型结构的数组
dtype 对象使用如下形式进行构造,如下所示:
numpy.dtype(object, align, copy)
- object:表示要转换为的数据类型对象。
- align:若为 true,在内存块填充字段将中以 C 结构进行排列。
- copy:复制 dtype 对象 ,如果为 false,则表示对内置数据类型对象的引用。
1) dtype 生成数据类型对象
定义复合类型结构的数组是 dtype 的作用之一,你可能对这个概念不是很理解,不用着急慢慢来。dtype 可以使用很多的方式对复合类型数组进行定义,我们先看一段简单的代码示例:
In [1]: import numpy as np #创建dtype数据类型对象 In [2]: dt_object=np.dtype(np.int64) In [3]: dt_object Out[3]: dtype('int64') #也可以是类型代码创建 In [4]: dt_object=np.dtype('i2') In [5]: dt_object Out[5]: dtype('int16') In [6]: dt_object=np.dtype('i2') #使用dt_object数据类型对象,构建array1数组 In [7]: array1=np.array([1,2,3,4],dtype=dt_object) In [8]: array1 Out[8]: array([1, 2, 3, 4], dtype=int16)
2) dtype构建复合型数组过程
从上面代码,我们了解了 dtype 的基本使用方法,然后我们看如下代码示例:
In [8]: import numpy as np In [9]: dt_obj=np.dtype([('name',np.str)]) In [10]: dt_obj Out[10]: dtype([('name', '<U')]) In [11]: dt_age=np.dtype([('age','u4')]) In [12]: dt_age Out[12]: dtype([('age', '<u4')]) In [13]: dt_score=np.dtype([('score',np.float32)]) In [14]: dt_score Out[14]: dtype([('score', '<f4')])
看完上述代码你是什么感觉呢?我们使用 dtype 构建了三个数据类型对象,分别为 name、age 、score 这三个元素,它们三者可以构成一个说明学生情况的信息集合,所以我们再进行如下操作:
#构建学生信息的数据类型 In [18]: stu=np.dtype([('name','U3'),('age','u4'),('socre','f4')]) In [19]: stu Out[19]: [('name', 'U3'), ('age', 'u4'), ('socre', 'f4')] #创建学生实例数组,统一数据类型为stu In [20]: stu_instance=np.array([('Aer',21,60),('Hua',20,59)],dtype=stu) In [21]: print(stu_instance) [('Aer', 21, 60.) ('Hua', 20, 59.)]
这就是定义复合类型数组的详细过程,总结来看,主要是 dtype 数据类型对象的构建过程,我们知道,Numpy 数组必须是同质数组,即数组中每个元素的数据类型都相同,在上述代 stu_instance 数组中学生视为数组中元素,然后使用 dtype 属性将元素的数据类型统一,而前面的操作详细介绍了如何使用 dtype 设置数据类型对象的完整过程,这个过程需要大家好好理解。
3)dtype数据对象简单属性
dtype 数据对象常用的属性如下:char属性用来获取数据类型对应的字符码;type 属性用来获取数组元素对象的数据类型;str 属性是一个用来描述数据类型的字符串,使用 str 还会获取数数据类型大小端字节序以及它字节数。简单使用如下:
In [1]: import numpy as np In [2]: dt=np.dtype('i4') In [3]: dt.char Out[3]: 'l' In [4]: dt=np.dtype('U4') In [5]: dt.char Out[5]: 'U' In [6]: dt.type Out[6]: numpy.str_ In [7]: dt.str Out[7]: '<U4'
2. 构建复合类型数组的常用方法
通过了上述复合类型数组的构建过程的学习,我们知道了什么是复合类型,机会把多个单一的数据组合成一个维度,用来说明另外一个数组元素。当然你要确保这个数据元素有意义性,就像数据分析中,影响最终结果的各种因素一样,若是风马牛不相及,那又有什么价值呢?下面就给大家总结一下构建复合型数组的几种常用方法,简单易懂:
#准备好一组数据 data=[ ('小明', ['A', 'B', 'A'], 17), ('小红', ['B', 'A', 'C'], 18), ('小王', ['C', 'A', 'A'], 19) ] #第一种设置dtype的方式 #3U3代表,3个元素的一维数组每个元素都是Unicode类型,长度为3 a = np.array(data, dtype='U8, 3U3, int32') print(a) print(a[0]['f0'], ":", a[1]['f1'])
结果: [('小明', ['A', 'B', 'A'], 17),('小红', ['B', 'A', 'C'], 18),('小王', ['C', 'A', 'A'], 19)] 小明 : ['B' 'A' 'C']
其中 f0 与 f1分别代表构成数组元素中的相应索引位置,上述数组中由 f0、f1、f2 组成。
#第二种方式 import numpy as np data=[ ('小明', ['A', 'B', 'A'], 17), ('小红', ['B', 'A', 'C'], 18), ('小王', ['C', 'A', 'A'], 19) ] #给每个元素分别进行命名,然后调用内部规定的键组成字典 #{‘names': …, ‘formats': …, ‘offsets': …, ‘titles': …, ‘itemsize': …} a = np.array(data, dtype={'names': ['name', 'leves', 'ages'], 'formats': ['U3', '3U3', 'int32']}) print(a[0]['name'], ":", a[0]['leves'], ":", a.itemsize)
第二种方式可能理解起来稍微会麻烦一点,这里调用 Numpy 内部自建的字典键,names 指定给元素的命名列表;formats 指定每一个元素的数据类型描述信息列表等等。
#第三种方式 import numpy as np data=[ ('小明', ['A', 'B', 'A'], 17), ('小红', ['B', 'A', 'C'], 18), ('小王', ['C', 'A', 'A'], 19) ] a = np.array(data, dtype={'names': ('U3', 0), 'leves': ('3U3', 16), 'ages': ('int32', 32)}) print(a[0]['names'], a[0]['leves'], a.itemsize)
这种方法同样使用字典的方式对数组中元素进行描述,上述三种方法大家根据自己熟练情况选择最适合自己的一种即可。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/24078.html