您的位置:

深入探究numpy.dtype

一、什么是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个元素组成的数组,每个元素都是我们刚才定义的复合类型。我们可以通过访问数组中的元素来获取特定字段的值。