第142集:NumPy数组基础
一、什么是NumPy?
NumPy(Numerical Python)是Python中用于科学计算的核心库,提供了高效的多维数组对象和丰富的数学函数,是数据分析、机器学习、深度学习等领域的基础工具。
NumPy的主要特点
- 高效的多维数组:提供
ndarray对象,用于存储和操作同类型的多维数据 - 矢量运算:支持广播(Broadcasting)机制,实现无需循环的高效元素级操作
- 丰富的数学函数:包含大量用于数组运算的数学函数(如线性代数、随机数生成等)
- 内存效率高:比Python列表更节省内存,访问速度更快
- 与其他库的良好集成:是Pandas、Matplotlib等数据分析和可视化库的基础
二、NumPy数组的创建
1. 从Python列表创建数组
使用np.array()函数可以将Python列表转换为NumPy数组:
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # 输出:[1 2 3 4 5]
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 输出:
# [[1 2 3]
# [4 5 6]]
# 创建三维数组
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3)2. 创建特殊数组
NumPy提供了多种创建特殊数组的函数:
# 创建全0数组
zeros = np.zeros((2, 3)) # 2行3列的全0数组
print(zeros)
# 创建全1数组
ones = np.ones((3, 2)) # 3行2列的全1数组
print(ones)
# 创建指定值数组
full = np.full((2, 2), 5) # 2行2列的全5数组
print(full)
# 创建单位矩阵(对角线为1,其余为0的方阵)
identity = np.eye(3) # 3x3的单位矩阵
print(identity)
# 创建对角矩阵
diagonal = np.diag([1, 2, 3]) # 对角线元素为1,2,3的矩阵
print(diagonal)3. 创建等差数列
# 创建等差数列(start, stop, num)
# 从0到10,生成5个元素
arr = np.linspace(0, 10, 5)
print(arr) # 输出:[ 0. 2.5 5. 7.5 10. ]
# 创建等差数列(start, stop, step)
# 从0到10,步长为2
arr = np.arange(0, 10, 2)
print(arr) # 输出:[0 2 4 6 8]4. 创建随机数组
# 创建0到1之间的随机浮点数数组
random_float = np.random.rand(2, 3) # 2行3列
print(random_float)
# 创建指定范围内的随机整数数组
random_int = np.random.randint(1, 10, size=(2, 3)) # 1-10之间的随机整数,2行3列
print(random_int)
# 创建符合正态分布的随机数数组
# 均值为0,标准差为1
random_normal = np.random.randn(2, 3)
print(random_normal)三、NumPy数组的属性
NumPy数组有一些重要的属性,可以帮助我们了解数组的结构:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 数组的维度
print(arr.ndim) # 输出:2
# 数组的形状(行数, 列数)
print(arr.shape) # 输出:(2, 3)
# 数组的元素总数
print(arr.size) # 输出:6
# 数组元素的数据类型
print(arr.dtype) # 输出:int64
# 每个元素所占的字节数
print(arr.itemsize) # 输出:8
# 数组所占的总字节数
print(arr.nbytes) # 输出:48 (6个元素 × 8字节/元素)四、NumPy数组的基本操作
1. 索引和切片
NumPy数组的索引和切片与Python列表类似,但支持多维索引:
import numpy as np
# 一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1[0]) # 输出:1
print(arr1[1:4]) # 输出:[2 3 4]
print(arr1[::2]) # 输出:[1 3 5]
# 二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2[0, 0]) # 输出:1(第0行第0列)
print(arr2[1, :]) # 输出:[4 5 6](第1行所有元素)
print(arr2[:, 1]) # 输出:[2 5 8](第1列所有元素)
print(arr2[0:2, 1:3]) # 输出:[[2 3], [5 6]](第0-1行,第1-2列)2. 数组的重塑
使用reshape()方法可以改变数组的形状,但元素总数必须保持不变:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
# 重塑为2行3列
reshaped = arr.reshape(2, 3)
print(reshaped)
# 输出:
# [[1 2 3]
# [4 5 6]]
# 重塑为3行2列
reshaped = arr.reshape(3, 2)
print(reshaped)
# 输出:
# [[1 2]
# [3 4]
# [5 6]]
# 使用-1自动计算维度
reshaped = arr.reshape(3, -1) # 3行,列数自动计算
print(reshaped)3. 数组的转置
使用transpose()方法或.T属性可以对数组进行转置:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 转置
transposed = arr.transpose()
print(transposed)
# 输出:
# [[1 4]
# [2 5]
# [3 6]]
# 使用.T属性
print(arr.T)4. 数组的拼接
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 水平拼接(按列拼接)
horizontal = np.hstack((arr1, arr2))
print(horizontal)
# 输出:
# [[1 2 5 6]
# [3 4 7 8]]
# 垂直拼接(按行拼接)
vertical = np.vstack((arr1, arr2))
print(vertical)
# 输出:
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]五、NumPy数组与Python列表的比较
| 特性 | NumPy数组 | Python列表 |
|---|---|---|
| 元素类型 | 必须相同 | 可以不同 |
| 内存效率 | 高 | 低 |
| 访问速度 | 快 | 慢 |
| 向量化运算 | 支持 | 不支持 |
| 数学函数 | 丰富 | 有限 |
| 多维支持 | 原生支持 | 通过嵌套实现 |
六、NumPy数组的优势
性能优势:
- NumPy数组在内存中是连续存储的,访问速度更快
- 向量化运算避免了Python的循环开销
- 底层使用C语言实现,执行效率高
语法简洁:
- 用
arr * 2代替[x * 2 for x in list] - 用
np.dot(arr1, arr2)实现矩阵乘法,无需嵌套循环
- 用
功能丰富:
- 提供了大量用于科学计算的函数
- 支持广播机制,简化不同形状数组之间的运算
七、总结
NumPy是Python数据分析的基础库,其核心是ndarray对象。本节课我们学习了:
- NumPy的基本概念和特点
- 数组的创建方法(从列表创建、特殊数组、等差数列、随机数组)
- 数组的属性(维度、形状、大小、数据类型)
- 基本操作(索引、切片、重塑、转置、拼接)
- 与Python列表的比较
掌握NumPy数组的基础知识是学习后续数据分析内容的关键。在下一节课中,我们将学习更多NumPy数组的高级操作,包括广播机制、数学运算等。
八、练习
- 创建一个3行4列的全0数组
- 创建一个4行4列的单位矩阵
- 创建一个从0到15的一维数组,然后重塑为4行4列
- 创建两个2行2列的数组,分别进行水平拼接和垂直拼接
- 计算数组中所有元素的和、平均值、最大值和最小值
扩展阅读
- NumPy官方文档:https://numpy.org/doc/
- NumPy教程:https://numpy.org/doc/stable/user/quickstart.html