【AI Study】第三天,NumPy(4)- 核心功能
NumPy 核心功能:科学计算的强大工具
- 【AI Study】第三天,NumPy
- 【AI Study】8-1,同NumPy类似的类库
- 【AI Study】8-2,知识图谱
- 【AI Study】8-3,基础知识
- 【AI Study】8-4,核心功能
- 【AI Study】8-5,高级应用
- 【AI Study】8-6,最佳实践
- 【AI Study】8-7,进阶学习
- 【AI Study】8-8,实用技巧
文章要点
- NumPy 的数学运算功能:基本运算、统计函数和线性代数
- 数组操作进阶:广播机制、高级索引和排序搜索
- 文件操作:文本和二进制文件的读写
- 实用的代码示例和性能优化建议
引言
NumPy 不仅提供了基础的数组操作,还包含了丰富的数学运算、高级数组操作和文件处理功能。这些核心功能使得 NumPy 成为科学计算和数据分析中不可或缺的工具。本文将深入探讨 NumPy 的核心功能,帮助读者掌握这些强大的工具。
1. 数学运算
1.1 基本运算
NumPy 支持对数组进行各种基本数学运算:
import numpy as np# 创建示例数组
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([5, 6, 7, 8])# 基本算术运算
print("加法:", arr1 + arr2) # 输出: [ 6 8 10 12]
print("减法:", arr2 - arr1) # 输出: [4 4 4 4]
print("乘法:", arr1 * arr2) # 输出: [ 5 12 21 32]
print("除法:", arr2 / arr1) # 输出: [5. 3. 2.33333333 2. ]# 幂运算
print("平方:", arr1 ** 2) # 输出: [ 1 4 9 16]# 矩阵乘法
mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[5, 6], [7, 8]])
print("矩阵乘法:\n", np.dot(mat1, mat2))
1.2 统计函数
NumPy 提供了丰富的统计函数:
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])# 基本统计量
print("平均值:", np.mean(arr)) # 输出: 5.0
print("中位数:", np.median(arr)) # 输出: 5.0
print("标准差:", np.std(arr)) # 输出: 2.581988897471611
print("方差:", np.var(arr)) # 输出: 6.666666666666667# 最大最小值
print("最大值:", np.max(arr)) # 输出: 9
print("最小值:", np.min(arr)) # 输出: 1# 分位数
print("25%分位数:", np.percentile(arr, 25)) # 输出: 3.0
print("75%分位数:", np.percentile(arr, 75)) # 输出: 7.0
1.3 数学函数
NumPy 提供了常用的数学函数:
arr = np.array([0, np.pi/4, np.pi/2])# 三角函数
print("正弦:", np.sin(arr))
print("余弦:", np.cos(arr))
print("正切:", np.tan(arr))# 指数和对数
print("指数:", np.exp(arr))
print("自然对数:", np.log(arr + 1))
print("以2为底的对数:", np.log2(arr + 1))
1.4 线性代数运算
NumPy 的线性代数模块提供了强大的矩阵运算功能:
from numpy import linalg# 创建矩阵
A = np.array([[1, 2], [3, 4]])# 计算行列式
det = linalg.det(A)
print("行列式:", det)# 计算特征值和特征向量
eigenvals, eigenvecs = linalg.eig(A)
print("特征值:", eigenvals)
print("特征向量:\n", eigenvecs)# 矩阵分解
# QR分解
Q, R = linalg.qr(A)
print("QR分解:\nQ:\n", Q, "\nR:\n", R)# SVD分解
U, S, V = linalg.svd(A)
print("SVD分解:\nU:\n", U, "\nS:\n", S, "\nV:\n", V)
2. 数组操作进阶
2.1 广播机制
NumPy 的广播机制允许不同形状的数组进行运算:
# 广播示例
arr = np.array([[1, 2, 3],[4, 5, 6]])
scalar = 2# 标量与数组运算
print("数组乘以标量:\n", arr * scalar)# 不同形状数组的运算
arr1 = np.array([[1, 2, 3]])
arr2 = np.array([[1],[2]])
print("广播运算:\n", arr1 + arr2)
2.2 高级索引
NumPy 支持多种高级索引方式:
arr = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 整数数组索引
indices = np.array([0, 2])
print("整数数组索引:", arr[indices])# 布尔索引
mask = arr > 5
print("布尔索引:\n", arr[mask])# 组合索引
print("组合索引:", arr[0:2, [0, 2]])
2.3 数组排序与搜索
NumPy 提供了强大的排序和搜索功能:
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])# 排序
sorted_arr = np.sort(arr)
print("排序后:", sorted_arr)# 返回排序索引
indices = np.argsort(arr)
print("排序索引:", indices)# 搜索
print("最大值索引:", np.argmax(arr))
print("最小值索引:", np.argmin(arr))# 唯一值
unique_vals = np.unique(arr)
print("唯一值:", unique_vals)
3. 文件操作
3.1 文本文件读写
NumPy 提供了多种文本文件读写方法:
# 保存数组到文本文件
arr = np.array([[1, 2, 3],[4, 5, 6]])
np.savetxt('array.txt', arr, delimiter=',')# 从文本文件加载数组
loaded_arr = np.loadtxt('array.txt', delimiter=',')
print("加载的数组:\n", loaded_arr)# 使用 genfromtxt 处理缺失值
data = np.genfromtxt('data.txt', delimiter=',', filling_values=0)
3.2 二进制文件操作
对于大型数组,二进制文件操作更高效:
# 保存数组到二进制文件
arr = np.array([[1, 2, 3],[4, 5, 6]])
np.save('array.npy', arr)# 加载二进制文件
loaded_arr = np.load('array.npy')
print("加载的数组:\n", loaded_arr)# 保存多个数组
np.savez('arrays.npz', arr1=arr, arr2=arr*2)
最佳实践
- 使用向量化操作代替循环,提高性能
- 合理使用广播机制,避免不必要的数组复制
- 对于大型数组,优先使用二进制文件格式
- 注意数值精度,选择合适的数据类型
- 使用适当的数学函数,避免重复实现
总结
本文介绍了 NumPy 的核心功能,包括数学运算、高级数组操作和文件处理。这些功能使得 NumPy 成为科学计算和数据分析的强大工具。掌握这些核心功能,可以帮助我们更高效地进行数据分析和科学计算。
参考资源
- NumPy 官方文档
- NumPy 数学函数参考
- NumPy 线性代数参考