HoRain云--NumPy数据类型全解析:高效计算的关键

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

NumPy 的核心优势之一是其强大的数据类型系统,这确保了数值计算的高效性和内存使用的优化。NumPy 数组(ndarray)是同质的,即所有元素必须是相同的数据类型。
基本数据类型
1. 整数类型
|
类型 |
描述 |
范围 |
|---|---|---|
|
|
8位有符号/无符号整数 |
-128~127 / 0~255 |
|
|
16位有符号/无符号整数 |
-32768~32767 / 0~65535 |
|
|
32位有符号/无符号整数 |
-2³¹~2³¹-1 / 0~2³²-1 |
|
|
64位有符号/无符号整数 |
-2⁶³~2⁶³-1 / 0~2⁶⁴-1 |
|
|
平台默认整数(通常为int64) |
取决于平台 |
import numpy as np
# 指定整数类型
arr = np.array([1, 2, 3], dtype=np.int32)
print(arr.dtype) # int32
# 创建特定类型的零数组
zeros_int8 = np.zeros(5, dtype=np.int8)
print(zeros_int8.dtype) # int8
2. 浮点类型
|
类型 |
描述 |
精度 |
|---|---|---|
|
|
半精度浮点数 |
约5位小数 |
|
|
单精度浮点数 |
约7位小数 |
|
|
双精度浮点数(默认) |
约15位小数 |
|
|
扩展精度浮点数(某些平台) |
更高精度 |
|
|
平台默认浮点数(通常为float64) |
# 默认浮点类型是float64
arr_float = np.array([1.0, 2.0, 3.0])
print(arr_float.dtype) # float64
# 指定单精度
arr_float32 = np.array([1.0, 2.0, 3.0], dtype=np.float32)
print(arr_float32.dtype) # float32
# 半精度示例
arr_float16 = np.array([1.0, 2.0], dtype=np.float16)
print(arr_float16.dtype) # float16
3. 复数类型
|
类型 |
描述 |
|---|---|
|
|
由两个float32组成(实部和虚部) |
|
|
由两个float64组成(默认) |
|
|
由两个float128组成 |
|
|
平台默认复数类型 |
# 复数数组
arr_complex = np.array([1+2j, 3+4j])
print(arr_complex.dtype) # complex128
# 指定单精度复数
arr_complex64 = np.array([1+2j, 3+4j], dtype=np.complex64)
print(arr_complex64.dtype) # complex64
4. 布尔类型
# 布尔类型
arr_bool = np.array([True, False, True])
print(arr_bool.dtype) # bool
# 注意:bool在内存中占1个字节
print(arr_bool.itemsize) # 1
5. 字符串类型
# 固定长度的字符串
arr_str = np.array(['hello', 'world'])
print(arr_str.dtype) # <U5 (长度为5的Unicode字符串)
# 指定最大长度
arr_str_fixed = np.array(['abc', 'defg'], dtype='S10') # 最大10字节
print(arr_str_fixed.dtype) # |S10
# Unicode字符串
arr_unicode = np.array(['你好', '世界'], dtype='U10')
print(arr_unicode.dtype) # <U10
数据类型操作
1. 查看和修改数据类型
# 查看数据类型
arr = np.array([1, 2, 3])
print(arr.dtype) # int64 (默认)
# 修改数据类型(创建新数组)
arr_float = arr.astype(np.float32)
print(arr_float.dtype) # float32
print(arr_float) # [1. 2. 3.]
# astype会创建新数组,不会改变原数组
print(arr.dtype) # int64
2. 创建时指定数据类型
# 创建数组时指定dtype
arr1 = np.array([1, 2, 3], dtype=np.int16)
arr2 = np.array([1.0, 2.0, 3.0], dtype=np.float32)
arr3 = np.array([True, False], dtype=bool)
3. 数据类型转换规则
# 混合类型会自动提升
arr = np.array([1, 2.5, 3]) # 包含整数和浮点数
print(arr.dtype) # float64
arr2 = np.array([1, 2+3j, 3]) # 包含整数和复数
print(arr2.dtype) # complex128
特殊数据类型
1. 结构化数据类型(记录数组)
# 定义结构类型
dt = np.dtype([
('name', 'U20'), # 20字符的Unicode字符串
('age', 'i4'), # 32位整数
('height', 'f8'), # 64位浮点数
('weight', 'f8')
])
# 创建结构化数组
people = np.array([
('Alice', 25, 1.65, 55.5),
('Bob', 30, 1.80, 75.0),
('Charlie', 35, 1.75, 80.2)
], dtype=dt)
print(people)
# 输出: [('Alice', 25, 1.65, 55.5) ('Bob', 30, 1.8 , 75. ) ('Charlie', 35, 1.75, 80.2)]
# 访问字段
print(people['name']) # ['Alice' 'Bob' 'Charlie']
print(people['age']) # [25 30 35]
print(people[0]) # ('Alice', 25, 1.65, 55.5)
print(people[0]['name']) # Alice
2. 日期时间类型
# 日期时间
dates = np.array(['2024-01-01', '2024-01-02'], dtype='datetime64[D]')
print(dates.dtype) # datetime64[D]
# 时间差
deltas = np.array([1, 2, 3], dtype='timedelta64[D]')
print(deltas.dtype) # timedelta64[D]
# 运算
tomorrow = dates[0] + np.timedelta64(1, 'D')
print(tomorrow) # 2024-01-02
类型字符码
NumPy 使用单字符代码表示数据类型,这在某些函数中很常见:
|
字符 |
对应类型 |
|---|---|
|
|
布尔型 |
|
|
有符号整数 |
|
|
无符号整数 |
|
|
浮点数 |
|
|
复数 |
|
|
字节字符串 |
|
|
Unicode字符串 |
|
|
Python对象 |
|
|
日期时间 |
|
|
时间差 |
# 使用字符码
arr1 = np.array([1, 2, 3], dtype='i4') # 32位整数
arr2 = np.array([1.0, 2.0], dtype='f8') # 64位浮点数
arr3 = np.array(['a', 'b'], dtype='U1') # 1字符Unicode
数据类型信息
arr = np.array([1, 2, 3], dtype=np.int32)
# 获取类型信息
print(arr.dtype) # int32
print(arr.dtype.name) # int32
print(arr.dtype.kind) # 'i' (整数类型)
print(arr.dtype.itemsize) # 4 (字节数)
print(arr.dtype.type) # <class 'numpy.int32'>
# 类型边界
print(np.iinfo(np.int32).min) # -2147483648
print(np.iinfo(np.int32).max) # 2147483647
print(np.finfo(np.float32).eps) # 机器精度
内存优化技巧
1. 选择合适的数据类型
# 不必要的大类型浪费内存
arr_bad = np.ones((1000, 1000), dtype=np.float64) # 8MB
arr_good = np.ones((1000, 1000), dtype=np.float32) # 4MB (节省一半)
# 对于布尔值,使用bool类型
bool_arr = np.array([True, False, True], dtype=bool) # 1字节/元素
2. 查看内存使用
arr = np.ones((100, 100), dtype=np.float64)
print(arr.nbytes) # 80000 字节 (100 * 100 * 8)
print(arr.size * arr.itemsize) # 同样计算字节数
总结
-
同质性:NumPy 数组所有元素类型必须相同
-
明确指定:创建数组时最好明确指定
dtype,避免意外类型提升 -
内存意识:选择满足需求的最小类型,特别是处理大型数组时
-
类型安全:使用
astype()进行显式转换,注意精度损失 -
灵活性:结构化数组允许创建类似数据库表的复合数据类型
NumPy 的类型系统是其高性能计算的基础,理解并正确使用这些类型是有效使用 NumPy 的关键。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)