一、什么是numpy.dtype
在深入探究numpy.dtype之前,我们先来了解一下数组的概念。在NumPy库中,数组是多维数组的容器,其中所有元素都必须具有相同的数据类型(称为dtype)。
而在numpy中,dtype表示数据类型的对象。一个Array的dtype描述了每个元素所占的字节数以及与数组中元素相关的其他信息,如字节顺序、数据格式和存储布局等。
通过以下代码我们可以创建一个具有int8数据类型的numpy数组:
import numpy as np
arr = np.array([1, 2, 3], dtype='int8')
print(arr.dtype)
在这个例子中,我们创建了一个三个元素的一维数组,并指定了数据类型为int8,即每个元素占用一个字节。
二、dtype对象的属性
dtype对象具有一系列属性,用于描述该对象的元素类型。以下是一些常见的属性:
1. dtype.name
该属性返回dtype对象的名称字符串,如'int8'。
arr = np.array([1, 2, 3], dtype='int8')
print(arr.dtype.name)
2. dtype.shape
该属性返回dtype对象的形状。在不同的dtype中,该属性的意义是不同的。对于标量类型,它的形状为 () ;对于数组类型,它的形状为 数组的形状,如 (2, 3)。
arr = np.array([1, 2, 3], dtype='int8')
print(arr.dtype.shape)
3. dtype.kind
该属性返回dtype对象的字符代码,表示其通用种类。可选的字符代码包括:"b"(布尔)、"i"(符号整数)、"u"(无符号整数)、"f"(浮点数)、"c"(复数浮点数)等。
arr = np.array([1, 2, 3], dtype='int8')
print(arr.dtype.kind)
4. dtype.itemsize
该属性返回类型码字符的长度(以字节为单位)。例如,int8类型的项目大小为1个字节,float64类型的项目大小为8个字节。
arr = np.array([1, 2, 3], dtype='int8')
print(arr.dtype.itemsize)
三、dtype的类型编码
在NumPy中,dtype的标准类型代码用于标识各种数据类型。以下是一些常见的标准类型代码:
类型代码 | 说明 | 举例 |
---|---|---|
'b' | 布尔型 | 'bool' |
'i' | 有符号整数型 | 'int8', 'int16', 'int32', 'int64' |
'u' | 无符号整数型 | 'uint8', 'uint16', 'uint32', 'uint64' |
'f' | 浮点型 | 'float16', 'float32', 'float64', 'float128' |
'c' | 复数浮点型 | 'complex64', 'complex128', 'complex256' |
'S' | 定长字符串型 | 'S10', 'S20', 'S30' |
'U' | Unicode字符串型 | 'U10', 'U20', 'U30' |
下面是几个dtype类型编码的例子:
# 创建一个uint16类型的数组
arr = np.zeros(3, dtype='uint16')
print(arr)
# 创建一个float32类型的数组
arr = np.ones(3, dtype='float32')
print(arr)
# 创建一个定长字符串类型的数组
arr = np.array(['hello', 'world'], dtype='S10')
print(arr)
# 创建一个Unicode字符串类型的数组
arr = np.array(['中文', 'english'], dtype='U10')
print(arr)
四、自定义dtype
除了标准类型代码,NumPy还允许用户创建自定义的dtype。自定义dtype可以包含复杂的数据结构,例如结构体。下面是一个自定义dtype的例子:
# 定义一个复合类型
dt = np.dtype([('name', 'S10'), ('age', 'int8'), ('gender', 'U1')])
# 创建一个数组
arr = np.array([('Tom', 18, 'M'), ('Mary', 20, 'F'), ('John', 23, 'M')], dtype=dt)
# 访问元素
print(arr[0]['name'])
print(arr[1]['age'])
print(arr[2]['gender'])
在这个例子中,我们定义了一个复合类型,包含名字、年龄和性别三个字段,分别用10字节的字符串、1字节的整数和1个字符的Unicode字符串来表示。然后我们创建了一个由3个元素组成的数组,每个元素都是我们刚才定义的复合类型。我们可以通过访问数组中的元素来获取特定字段的值。