- ·上一篇内容:NumPy中的ndarray对象
- ·下一篇内容:NumPy 数组数据类型的转换
NumPy的数据类型
NumPy支持的数据类型远比Python本身要多,下表给出了NumPy中定义的标量类型。
类型名称 | 含义 |
---|---|
bool_ | 布尔类型,仅有True或False两个值,用1个字节来存储 |
int_ | 默认的有符号整数类型,类似C语言中的long类型,在32位机上为32位,在64位机上为64位。 |
intc | 与C语言中的int兼容。 |
intp | 用于索引的整数类型(类似于C的ssize_t,通常情况下仍然是Int32或int64) |
int8 | 8位符号整数(一个字节),取值范围:-128 ~ 127 |
int16 | 16位符号整数,取值范围:-32768 ~ 32767 |
int32 | 32位符号整数,取值范围:-2147483648 ~ 2147483647 |
int64 | 64位符号整数,取值范围: -9223372036854775808 ~ 9223372036854775807 |
uint8 | 8位无符号整数,取值范围:0 ~ 255 |
uint16 | 16位无符号整数,取值范围: 0 ~ 65535 |
uint32 | 32位无符号整数,取值范围: 0 ~ 4294967295 |
uint64 | 64位无符号整数,取值范围: 0 ~ 18446744073709551615 |
float_ | float64的简写 |
float16 | 半精度浮点数,包括:1个符号位,5位指数,10位尾数 |
float32 | 单精度浮点数,包括:1个符号位,8位指数,23位尾数 |
float64 | 双精度浮点数,包括:1个符号位,11位指数,52位尾数 |
complex_ | complex128的简写 |
complex64 | 复数,由32位浮点数表示(实数部分和虚数部分) |
complex128 | 复数,由64位浮点数表示(实数部分和虚数部分) |
NumPy的数值类型是dtype对象的实例,每个实例都有唯一的字符对应。如np.bool_,np.float32,np.uint32等。
内建数据类型的字符代码
每个内置数据类型都有一个唯一字符代码进行标识,其对应情况如下所示:
字符代码 | 对应类型 |
---|---|
'?' | 布尔类型,数组元素只能是True或False |
'b' | 有符号8位整型(signed byte) |
'B' | 无符号8位整型(unsigned byte) |
'i' | 有符号整型 |
'u' | 无符号整型 |
'f' | 浮点类型 |
'c' | 复数-浮点类型 |
'm' | timedelta(时间间隔) |
'M' | datetime(日期时间) |
'O' | (Python)对象 |
'S', 'a' | 字符串(固定长度字符序列) |
'U' | Unicode(固定长度的Unicode字符序列(32位)) |
'V' | 原始数据(void-每个元素都是一个固定大小的内存块) |
数据类型对象-dtype
数据类型对象(data type object)(numpy.dtype类的实例)用于描述数组元素在固定大小的内存区域存储的方式。其主要描述了数据以下几个方面:
(1)数据的类型(如整型、浮点型、Python对象等);
(2)数据的大小(如整型使用多少字节进行存储);
(3)数据的字节顺序(大端方式或小端方式);
(4)如果数据类型是结构化类型(其他数据类型的集合:由简单数据类型组成的命名的序列),则需要说明字段的名称(以便进行访问)、每个字段的数据类型、每个字段占用的内存哪一部分。
(5)如果数据类型是子数组,则其形状(shape)和数据类型是什么。
字节顺序通过在数据类型前加上‘<’或‘>’来决定。
‘<’表示编码是小端方式的(最低有效位存储在最小地址中)。
‘>’表示编码是大端方式的(最高有效字节存储在最小地址中)。
指定和构造数据类型
当需要在NumPy函数或方法中需要数据类型时,就可以运用dype对象或可以转换为dtype对象的类型。
使用下面的语法方式进行构造:
numpy.dtype(object, align, copy)
其中,各参数的含义如下:
object - 要转换的数据类型对象
align - 如果为true,则填充字段,使其类似C的结构体
copy - 创建dtype对象的新副本。如果为false,则结果是对内置数据类型对象的引用
其中,align和copy两个参数是可选参数。
当object为None时,默认的数据类型为float64。
一些例子
下面使用一些例子来说明数据类型的具体使用方式。
(1)数组标量类型
import numpy as np dt1 = np.dtype(np.int32) # 32位整型数 dt2 = np.dtype(np.complex128) # 128位浮点类型复数 print(dt1) print(dt2)
输出结果如下:
int32
complex128
(2)使用字符表示的数据类型
import numpy as np dt3 = np.dtype('?') dt4 = np.dtype('b') dt5 = np.dtype('B') dt6 = np.dtype('f') dt7 = np.dtype('i8') dt8 = np.dtype('f2') print(dt3, dt4, dt5, dt6, dt7, dt8)
输出结果如下:
bool int8 uint8 float32 int64 float16
在上面的例子中,'i8'表示8个字节的整型数,因此输出int64,即64位整数。同样,'f2'表示2个字节的浮点数,输出的float16表示16位浮点数(半精度)。
(3)带端序的字符
下面的例子中使用带端序的字符串定义数据类型。
import numpy as np dt9= np.dtype('>B') dt10 = np.dtype('<f') dt11 = np.dtype('=i') dt12 = np.dtype('i') print(dt9, dt10, dt11, dt12)
上面代码的输出结果如下:
uint8 float32 int32 int32
在上面的例子中 '=i' 和 'i' 的效果是相同的,也是在未指定 '>' (大端方式) 和 '<' (小端方式)时的默认值,即依赖于硬件情况。
(4)创建结构化数据类型
下面例子中演示了结构化类型的使用方式。
import numpy as np dt13 = np.dtype([('age', np.int8)]) print(dt13)
输出结果如下:
[('age', 'i1')]
(5)将结构化数据类型运用于ndarray
下面例子说明了如何将结构化类型运用于ndarray对象。
import numpy as np dt13 = np.dtype([('age', np.int8)]) arr = np.array([(10,), (20,), (30,)], dtype=dt13) print(arr)
输出结果如下:
[(10,) (20,) (30,)]
(6)访问结构化类型中的字段内容
下面例子给出了访问结构化类型中字段内容的方式。
import numpy as np dt13 = np.dtype([('age', np.int8)]) arr = np.array([(10,), (20,), (30,)], dtype=dt13) print(arr['age'])
输出结果如下:
[10 20 30]
(7)一个更复杂点的结构化类型
下面例子中定义了一个名为student的结构化数据类型,包含一个字符串类型的name字段,整型的age字段和float类型的marks字段。并将该dtype应用到ndarray对象。
import numpy as np student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')]) print(student)
输出结果如下:
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])
(8)将复杂的结构化类型运用于ndarray对象
下面的例子将上例中定义的student结构化类型运用于数组定义中,并将定义的数组进行输出。
import numpy as np student = np.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')]) arr = np.array([('XiaoMing', 21, 85), ('FangHua', 18, 95)], dtype=student) print(arr)
输出结果如下:
[(b'XiaoMing', 21, 85.) (b'FangHua', 18, 95.)]
微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。
个人成长离不开各位的关注,你的关注就是我继续前行的动力。