Python NumPy教程之数据类型对象详解
本文深入解析Python NumPy中每个ndarray关联的数据类型对象(dtype)。详细阐述如何使用numpy.dtype类构造dtype对象,解析obj、align和copy等关键参数,并对比type与dtype的区别。此外,通过代码示例演示如何利用结构化dtype创建包含不同字段类型的数组,涵盖字节序、大小及子数组形状等核心概念。
每个NumPy数组(ndarray)都关联一个数据类型(dtype)对象,该对象定义了数组在内存中的布局方式。具体而言,它提供了以下关键信息:
- 数据的具体类型,例如整数、浮点数或Python对象等。
- 数据占用的内存大小,以字节为单位。
- 数据的字节存储顺序,即小端序(little-endian)或大端序(big-endian)。
- 若数据类型为子数组,则包含其形状定义及子数组的数据类型。
ndarray的值实际存储在缓冲区中,表现为连续的内存字节序列。dtype对象决定了如何解释这些字节,从而确定数据的最终形态。
构造数据类型(dtype)对象
数据类型对象是numpy.dtype类的一个实例,可以通过调用numpy.dtype函数来创建。
该函数接受以下参数:
obj:需要转换为数据类型对象的原始对象。
align:布尔值,可选。若设为True,会在字段中添加填充以匹配C编译器生成的类似C结构体的对齐方式。
copy:布尔值,可选。若设为True,将创建一个新的数据类型对象副本;若为False,结果可能仅引用内置的数据类型对象。
# Python 程序创建数据类型对象
import numpy as np
# np.int16 被转换为数据类型对象。
print(np.dtype(np.int16))
函数返回转换后的数据类型对象,例如:
int16
# Python 程序创建一个包含 32 位大端整数的数据类型对象
import numpy as np
# i4 表示大小为 4 字节的整数
# > 表示大端字节序和
# < 表示小端编码。
# dt 是一个 dtype 对象
dt = np.dtype('>i4')
print("Byte order is:",dt.byteorder)
print("Size is:", dt.itemsize)
print("Data type is:", dt.name)
以下为创建包含特定字节序和大小的数据类型对象的示例输出:
Byte order is: > Size is: 4 Name of data type is: int32
在上述示例中使用的类型说明符(如i4)还可以采用其他多种格式表示:
包括b1、i1、i2、i4、i8、u1、u2、u4、u8、f2、f4、f8、c8、c16以及a(分别代表字节、不同大小的整数、无符号整数、浮点数、指定字节长度的复数和定长字符串)。
或者使用更直观的命名方式,如int8、...、uint8、...、float16、float32、float64、complex64、complex128(此处数字表示位数)。
需要注意的是,dtype与Python内置的type并不相同。
# 用于区分类型和数据类型的 Python 程序。
import numpy as np
a = np.array([1])
print("type is: ",type(a))
print("dtype is: ",a.dtype)
以下是区分类型和数据类型的代码输出示例:
type is: dtype is: int32
具有结构化数组的数据类型对象
dtype对象在创建结构化数组时非常有用。结构化数组是指包含多种不同类型数据的数组,可以通过字段名直接访问其中的数据。
字段类似于为对象指定名称。在结构化数组中,对应的dtype对象也是结构化的,允许定义多个字段及其类型。
# 用于演示字段使用的 Python 程序
import numpy as np
# 一种结构化数据类型,包含一个 16 字符的字符串(在“name”字段中)和两个 64 位浮点数的子数组(在“grades”字段中)
dt = np.dtype([('name', np.unicode_, 16),
('grades', np.float64, (2,))])
# 具有字段等级的对象的数据类型
print(dt['grades'])
# 具有字段名称的对象的数据类型
print(dt['name'])
以下是访问结构化数组中特定字段类型的输出示例:
('<f8', (2,))
# Python 程序演示了数据类型对象与结构化数组的使用。
import numpy as np
dt = np.dtype([('name', np.unicode_, 16),
('grades', np.float64, (2,))])
# x 是一个包含学生姓名和分数的结构化数组。
# 学生姓名的数据类型是np.unicode_,分数的数据类型是np.float(64)
x = np.array([('Sarah', (8.0, 7.0)),
('John', (6.0, 7.0))], dtype=dt)
print(x[1])
print("Grades of John are: ", x[1]['grades'])
print("Names are: ", x['name'])
以下是使用结构化数组进行数据操作的实际输出:
('John', [ 6., 7.]) Grades of John are: [ 6. 7.] Names are: ['Sarah' 'John']
本文介绍了Python NumPy中数据类型对象的核心概念与用法。如需了解更多Python NumPy数据类型相关内容,请查阅本站往期文章或继续浏览后续教程,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













