python numpy dtype object_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', '

In [11]: dt_age=np.dtype([('age','u4')])

In [12]: dt_age

Out[12]: dtype([('age', '

In [13]: dt_score=np.dtype([('score',np.float32)])

In [14]: dt_score

Out[14]: dtype([('score', '

看完上述代码你是什么感觉呢?我们使用 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]: '

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)

这种方法同样使用字典的方式对数组中元素进行描述,上述三种方法大家根据自己熟练情况选择最适合自己的一种即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值