🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

基本数据类型

1. 整数类型

2. 浮点类型

3. 复数类型

4. 布尔类型

5. 字符串类型

数据类型操作

1. 查看和修改数据类型

2. 创建时指定数据类型

3. 数据类型转换规则

特殊数据类型

1. 结构化数据类型(记录数组)

2. 日期时间类型

类型字符码

数据类型信息

内存优化技巧

1. 选择合适的数据类型

2. 查看内存使用

总结


img

NumPy 的核心优势之一是其强大的数据类型系统,这确保了数值计算的高效性和内存使用的优化。NumPy 数组(ndarray)是同质的,即所有元素必须是相同的数据类型。

基本数据类型

1. 整数类型

类型

描述

范围

int8/ uint8

8位有符号/无符号整数

-128~127 / 0~255

int16/ uint16

16位有符号/无符号整数

-32768~32767 / 0~65535

int32/ uint32

32位有符号/无符号整数

-2³¹~2³¹-1 / 0~2³²-1

int64/ uint64

64位有符号/无符号整数

-2⁶³~2⁶³-1 / 0~2⁶⁴-1

int_/ uint

平台默认整数(通常为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. 浮点类型

类型

描述

精度

float16

半精度浮点数

约5位小数

float32

单精度浮点数

约7位小数

float64

双精度浮点数(默认)

约15位小数

float128

扩展精度浮点数(某些平台)

更高精度

float_

平台默认浮点数(通常为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. 复数类型

类型

描述

complex64

由两个float32组成(实部和虚部)

complex128

由两个float64组成(默认)

complex256

由两个float128组成

complex_

平台默认复数类型

# 复数数组
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 使用单字符代码表示数据类型,这在某些函数中很常见:

字符

对应类型

b

布尔型

i

有符号整数

u

无符号整数

f

浮点数

c

复数

S/ a

字节字符串

U

Unicode字符串

O

Python对象

M

日期时间

m

时间差

# 使用字符码
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)  # 同样计算字节数

总结

  1. 同质性:NumPy 数组所有元素类型必须相同

  2. 明确指定:创建数组时最好明确指定 dtype,避免意外类型提升

  3. 内存意识:选择满足需求的最小类型,特别是处理大型数组时

  4. 类型安全:使用 astype()进行显式转换,注意精度损失

  5. 灵活性:结构化数组允许创建类似数据库表的复合数据类型

NumPy 的类型系统是其高性能计算的基础,理解并正确使用这些类型是有效使用 NumPy 的关键。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐