NumPy 教程
NumPy 是 Python 中用于科学计算的核心库,提供了高效的多维数组操作和数学函数支持。它是许多数据科学和机器学习库(如 Pandas、SciPy、TensorFlow)的基础。以下是对 NumPy 的中文简介,涵盖其定义、核心功能、数组操作、常见用法、注意事项及最佳实践,帮助你快速了解并掌握 NumPy。
一、NumPy 概述
1. 什么是 NumPy?
- 全称:Numerical Python
- 定义:NumPy 是一个开源的 Python 库,用于高效处理多维数组(ndarray)和数学计算。
- 特点:
- 高性能数组:基于 C 实现,操作速度远超 Python 原生列表。
- 多维数组:支持任意维度的数组(1D、2D、3D 等)。
- 丰富数学函数:提供线性代数、统计、随机数生成等功能。
- 跨平台:支持 Windows、macOS、Linux。
- 用途:
- 数据处理和分析。
- 科学计算(如矩阵运算、傅里叶变换)。
- 机器学习和深度学习的数据预处理。
2. 安装 NumPy
- 使用 pip 安装:
pip install numpy
- 验证安装:
import numpy as np
print(np.__version__) # 输出 NumPy 版本
二、NumPy 核心功能
1. ndarray(N 维数组)
- 定义:NumPy 的核心数据结构是
ndarray
(N-dimensional array),用于存储同类型元素的多维数组。 - 特点:
- 固定大小,创建后不可动态扩展。
- 支持高效的向量化和广播操作。
- 内存连续,访问速度快。
- 属性:
shape
:数组形状(如(3, 2)
表示 3 行 2 列)。dtype
:元素数据类型(如int32
、float64
)。ndim
:数组维数。size
:元素总数。
2. 高效的数学运算
- 支持元素级运算(如加、减、乘、除),无需显式循环。
- 提供线性代数、统计、随机数等函数。
3. 广播机制
- 自动扩展不同形状数组的运算,简化代码。
- 示例:标量与数组相加,自动应用于每个元素。
4. 跨库兼容性
- 与 Pandas、Matplotlib、SciPy 等无缝集成。
- 支持数据导入导出(如 CSV、NumPy 格式)。
三、创建 NumPy 数组
1. 从 Python 列表创建
import numpy as np
# 一维数组
arr1 = np.array([1, 2, 3])
print(arr1) # 输出:[1 2 3]
# 二维数组
arr2 = np.array([[1, 2], [3, 4], [5, 6]])
print(arr2) # 输出:
# [[1 2]
# [3 4]
# [5 6]]
2. 使用内置函数创建
- 全零数组:
zeros = np.zeros((2, 3)) # 2x3 零矩阵
print(zeros) # 输出:
# [[0. 0. 0.]
# [0. 0. 0.]]
- 全一数组:
ones = np.ones((2, 3)) # 2x3 单位矩阵
print(ones) # 输出:
# [[1. 1. 1.]
# [1. 1. 1.]]
- 指定值填充:
full = np.full((2, 2), 5) # 2x2 填充 5
print(full) # 输出:
# [[5 5]
# [5 5]]
- 等差序列:
arange = np.arange(0, 10, 2) # 从 0 到 10,步长 2
print(arange) # 输出:[0 2 4 6 8]
- 均匀分布:
linspace = np.linspace(0, 1, 5) # 从 0 到 1,生成 5 个点
print(linspace) # 输出:[0. 0.25 0.5 0.75 1. ]
- 随机数数组:
random = np.random.rand(2, 3) # 2x3 随机数(0-1)
print(random) # 输出:随机值
四、数组操作
1. 索引与切片
- 一维数组:
arr = np.array([1, 2, 3, 4])
print(arr[0]) # 输出:1
print(arr[1:3]) # 输出:[2 3]
- 二维数组:
arr2d = np.array([[1, 2], [3, 4], [5, 6]])
print(arr2d[0, 1]) # 输出:2
print(arr2d[:, 0]) # 输出:[1 3 5](第一列)
2. 形状操作
- 查看形状:
arr = np.array([[1, 2], [3, 4]])
print(arr.shape) # 输出:(2, 2)
- 改变形状:
arr = np.array([1, 2, 3, 4])
reshaped = arr.reshape(2, 2)
print(reshaped) # 输出:
# [[1 2]
# [3 4]]
- 展平数组:
flattened = arr2d.flatten()
print(flattened) # 输出:[1 2 3 4 5 6]
3. 数学运算
- 元素级运算:
arr = np.array([1, 2, 3])
print(arr + 2) # 输出:[3 4 5]
print(arr * 2) # 输出:[2 4 6]
- 数组间运算:
arr1 = np.array([1, 2])
arr2 = np.array([3, 4])
print(arr1 + arr2) # 输出:[4 6]
- 矩阵运算:
arr = np.array([[1, 2], [3, 4]])
print(np.dot(arr, arr)) # 矩阵乘法
# 输出:
# [[ 7 10]
# [15 22]]
4. 统计函数
- 均值、标准差:
arr = np.array([1, 2, 3, 4])
print(np.mean(arr)) # 输出:2.5
print(np.std(arr)) # 输出:1.118...
- 最大/最小值:
print(np.max(arr)) # 输出:4
print(np.min(arr)) # 输出:1
- 求和:
print(np.sum(arr)) # 输出:10
五、广播机制
广播(Broadcasting)允许 NumPy 对不同形状的数组进行运算:
arr = np.array([[1, 2], [3, 4]])
scalar = 2
print(arr + scalar) # 输出:
# [[3 4]
# [5 6]]
- 规则:
- 数组形状必须兼容(维度相等或一维为 1)。
- 较小数组自动扩展以匹配较大数组的形状。
六、常见用法示例
1. 数据预处理
标准化数据(零均值、单位方差):
data = np.array([1, 2, 3, 4, 5])
standardized = (data - np.mean(data)) / np.std(data)
print(standardized) # 输出:[-1.414... -0.707... 0. 0.707... 1.414...]
2. 矩阵运算
矩阵转置和求逆:
matrix = np.array([[1, 2], [3, 4]])
transposed = matrix.T
inverse = np.linalg.inv(matrix)
print(transposed) # 输出:
# [[1 3]
# [2 4]]
print(inverse) # 输出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
3. 随机数生成
生成随机整数:
random_ints = np.random.randint(0, 10, size=(2, 3))
print(random_ints) # 输出:2x3 随机整数矩阵
4. 数据保存与加载
- 保存为
.npy
文件:
arr = np.array([1, 2, 3])
np.save("array.npy", arr)
- 加载:
loaded = np.load("array.npy")
print(loaded) # 输出:[1 2 3]
七、注意事项
- 数据类型(dtype):
- NumPy 数组元素类型固定,创建时可指定(如
np.array([1, 2], dtype=np.float64)
)。 - 错误类型可能导致精度丢失(如
int
存储浮点数)。
- 内存效率:
- NumPy 数组比 Python 列表更节省内存,因存储连续且类型固定。
- 大数组操作需注意内存使用。
- 广播限制:
- 形状不兼容的数组运算会抛出
ValueError
。 - 示例:
python arr1 = np.array([1, 2]) arr2 = np.array([1, 2, 3]) # arr1 + arr2 # 报错:形状不匹配
- 性能优化:
- 避免循环,使用 NumPy 的向量化和内置函数。
- 示例:
python # 慢:循环 for i in range(len(arr)): arr[i] += 1 # 快:向量化 arr += 1
八、最佳实践
- 使用向量化操作:
- 优先使用 NumPy 的内置函数和广播,避免 Python 循环。
arr = np.array([1, 2, 3])
arr = arr * 2 # 高效
- 指定数据类型:
- 根据需求选择合适类型(如
int32
、float64
)以节省内存。
arr = np.array([1, 2, 3], dtype=np.int16)
- 检查数组形状:
- 操作前确认
shape
和ndim
,避免错误。
print(arr.shape, arr.ndim)
- 缓存大数组:
- 使用
np.save
/np.load
保存中间结果,减少重复计算。
- 结合其他库:
- 与 Pandas(数据分析)、Matplotlib(可视化)结合使用。
import pandas as pd
df = pd.DataFrame(np.array([[1, 2], [3, 4]]))
- 调试技巧:
- 使用
np.set_printoptions
控制输出格式。
np.set_printoptions(precision=2) # 保留 2 位小数
九、总结
NumPy 是 Python 科学计算的核心库,提供高效的 ndarray
对象和丰富的数学函数,支持多维数组操作、线性代数、统计分析等功能。掌握数组创建、索引、运算、广播机制及常见用法,能显著提升数据处理效率。遵循最佳实践(如向量化操作、指定数据类型),并结合 Pandas、Matplotlib 等库,可满足科学计算和数据分析需求。
如果你需要更复杂的示例(如高级矩阵运算、性能优化)或特定场景的 NumPy 代码,请告诉我!