Numpy dtype定义复合类型数组过程详解

数据类型对象是用来描述数组元素的数据类型的,在前面的知识介绍中,我们对 dtype 有了基本的认识,其实它的作用远超过你对它的简单认知,在本节我们将介绍 dtype 数据类型对象。

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

(0)
上一篇 2021年7月20日 11:32
下一篇 2021年7月20日 11:32

相关推荐

发表回复

登录后才能评论