# NumPy 核心处理方法
NumPy(Numerical Python)是一个用于科学计算的 Python 第三方库,它提供了:
# 核心功能:
- 多维数组对象
- 高效地存储和操作大规模数字数据。
- 比原生 Python 的列表(list)更快、更节省内存。
- 广播功能
- 数学函数库
- 包括线性代数、傅里叶变换、随机数生成、统计分析等。
- 数组索引与切片
- 支持布尔索引、花式索引,比 Python 原生更灵活强大。
# 引用
# 多维性
| arr = np.array(5) |
| print(arr) |
| print('arr的维度:', arr.ndim) |
| arr = np.array([1, 2, 3]) |
| print(arr) |
| print('arr的维度:', arr.ndim) |
# 同质性
| arr = np.array([1, 'hello', 3]) |
| print(arr) |
结果全部转化为字符串
# ndarray 的属性
| arr = np.array(1) |
| print(arr) |
| print('arr的维度:', arr.ndim) |
| print('arr的形状:', arr.shape) |
| print('arr的元素个数', arr.size) |
| print('arr的数据类型', arr.dtype) |
1
arr 的维度: 0
arr 的形状: ()
arr 的元素个数 1
arr 的数据类型 int64
| arr = np.array([1, 2.7, 3]) |
| print(arr) |
| print('arr的维度:', arr.ndim) |
| print('arr的形状:', arr.shape) |
| print('arr的元素个数', arr.size) |
| print('arr的数据类型', arr.dtype) |
| print('arr的转置', arr.T) |
[1. 2.7 3. ]
arr 的维度: 1
arr 的形状: (3,)
arr 的元素个数 3
arr 的数据类型 float64
arr 的转置 [1. 2.7 3.]
| arr = np.array([[1, 2, 3], [4, 5, 6]]) |
| print(arr) |
| print('arr的维度:', arr.ndim) |
| print('arr的形状:', arr.shape) |
| print('arr的元素个数', arr.size) |
| print('arr的数据类型', arr.dtype) |
| print('arr的转置', arr.T) |
[[1 2 3]
[4 5 6]]
arr 的维度: 2
arr 的形状: (2, 3)
arr 的元素个数 6
arr 的数据类型 int64
arr 的转置 [[1 4]
[2 5]
[3 6]]
# 指定元素数据类型
| list1 = [4, 5, 6] |
| arr = np.array(list1, dtype=np.float64) |
# 预定义数组
# 全零阵
| arr = np.zeros((4, 4), dtype=np.int64) |
| arr = np.zeros((60,), dtype=np.int64) |
# 全一阵
| arr = np.ones((4, 4), dtype=np.int64) |
# 空阵
# 满阵
[[2 2 2 2]
[2 2 2 2]
[2 2 2 2]]
# 形状模仿
| arr1 = np.zeros_like(arr) |
| arr2 = np.ones_like(arr) |
| arr3 = np.empty_like(arr) |
# 定增量(等差数列)
| arr = np.arange(1, 106, 1) |
# 定间隔(等分数列)
| app = np.linspace(1, 100, 10) |
# 对角阵
| arr = np.diag([1, 2, 3, 4, 5]) |
# 随机数组
# 默认零到一
| arr = np.random.rand(2, 4) |
# 指定区间
| arr = np.random.uniform(1, 4, (4, 4)) |
# 随机整数
| arr = np.random.randint(1, 10, (4, 4)) |
# 随机正态分布
| arr = np.random.randn(4, 4) |
# 随机种子
| |
| np.random.seed(20) |
| arr = np.random.randint(1, 4, (4, 4)) |
# 单位矩阵
| arr = np.eye(5, dtype=int) |
# 数据类型
# ndarray 的数据类型
- 布尔类型
- 整形
- 浮点型
- 复数型
主要通过 dtype 指定
| arr = np.array([1, 2, 3, 0, -1], dtype=np.int8) |
| arr = np.array([1, 2, 3, 0, -1], dtype=np.float32) |
# 索引与切片
# 索引
| |
| arr = np.random.randint(10, 100, 30) |
| |
| print(arr[3]) |
| print(arr[7]) |
| |
| print(arr[(arr > 30) & (arr < 50)]) |
| |
| arr = np.random.randint(10, 100, (5, 8)) |
| |
| print(arr[2, 3]) |
| print(arr[2][3]) |
# 切片
| |
| print(arr[3:7]) |
| print(arr[slice(3, 7)]) |
| print(arr[slice(0, 10, 2)]) |
| |
| print(arr[0, 1:3]) |
| print(arr[arr > 70]) |
| print(arr[0][arr[0] > 90]) |
| print(arr[3]) |
| print(arr[:, 3]) |
# 运算
# 常规运算
| arr1 = np.array([1, 2, 3]) |
| arr2 = np.array([4, 5, 6]) |
| print(arr1 + arr2) |
| print(arr1 * arr2) |
| print(arr1 - arr2) |
| print(arr1 / arr2) |
| print(arr1 ** arr2) |
| |
| listA = [1, 2, 3] |
| listB = [4, 5, 6] |
| for i in range(len(listA)): |
| print(listA[i] + listB[i]) |
python 原生只是纯粹的拼接,ndarray 是在帮你做计算
| arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
| arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
| print(arr1 + arr2) |
| print(arr1 * arr2) |
| print(arr1 - arr2) |
| print(arr1 / arr2) |
| print(arr1 ** arr2) |
# 广播机制
| |
| arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) |
| arr2 = np.array([1, 2, 3]) |
| print(arr1 + arr2) |
| print(arr1 * arr2) |
| arr1 = np.array([[1, 2, 3]]) |
| arr2 = np.array([[1], [2], [3]]) |
| print(arr1 + arr2) |
# 矩阵的运算
| |
| arr1 = np.array([[1, 2, 3], [4, 5, 6]]) |
| arr2 = np.array([[4, 5], [1, 2], [7, 8]]) |
| print(arr1.dot(arr2)) |
| print(arr1 @ arr2) |
# 常用函数
# 数学函数
# 平方根
| print(np.sqrt(9)) |
| print(np.sqrt([1, 4, 9])) |
# 指数
| |
| print(np.exp(1)) |
| print(np.exp([0, 2, 3])) |
# 自然对数
| |
| print(np.log(np.e)) |
| print(np.log([1, np.e, np.e ** 2])) |
| print(np.log10(100)) |
# 三角函数
| |
| print(np.sin(np.pi / 2)) |
| print(np.cos(np.pi)) |
# 绝对值
| |
| print(np.abs(-1)) |
| print(np.abs(np.array([1, -1, 0, -2, 2, -3, 3, -4, 4, -5, 5]))) |
# a 的 b 次幂
# 四舍五入
| |
| print(np.round(3.14)) |
| print(np.round([3.14, 2.7, 1.5, 1.2])) |
# 上取整与下取整
| |
| arr = np.array([1.2, 1.5, 1.6, 1.7, 2.2, 2.5, 2.6, 2.7]) |
| print(np.ceil(arr)) |
| print(np.floor(arr)) |
# 检测缺失值
| arr = np.array([1, 2, np.nan, 4, np.nan]) |
| print(np.isnan(arr)) |
# 统计函数
求和、计算平均值、计算中位数、标准差、方差、最大值、最小值、计算分位数、累积和、累积差
| arr = np.random.randint(1, 10, 10) |
| print(arr) |
| print('排序', np.sort(arr)) |
| print('求和', np.sum(arr)) |
| print('计算平均值', np.mean(arr)) |
| print('计算中位数', np.median(arr)) |
| print('标准差', np.std(arr)) |
| print('方差', np.var(arr)) |
| print('最大值', np.max(arr)) |
| print('最小值', np.min(arr)) |
| print('计算分位数', np.quantile(arr, 0.5)) |
| print('累积和', np.cumsum(arr)) |
| print('累积差', np.cumprod(arr)) |
# 比较函数
| |
| print(np.greater([1, 3, 5, 1, 8, 0, -23, 3], 2)) |
| |
| print(np.less([1, 3, 5, 1, 8, 0, -23, 3], 2)) |
| |
| print(np.equal([1, 3, 5, 1, 8, 0, -23, 3], 3)) |
# 逻辑运算
| |
| print(np.logical_and([1, 3, 5, 1, 8, 0, -23, 3], [1, 3, 5, 1, 8, 0, -23, 3])) |
| print(np.logical_or([1, 3, 5, 1, 8, 0, -23, 3], [1, 3, 5, 1, 8, 0, -23, 3])) |
# 自定义条件
| arr = np.array([1, 3, 5, 1, 8, 0, -23, 3]) |
| print(np.where(arr > 3, arr, 0)) |
| print(np.select([arr > 3, arr < 0], [arr, 0], default=arr)) |
# 排序函数
| arr = np.random.randint(1, 10, 20) |
| print(arr) |
| print(np.sort(arr)) |
| print(np.argsort(arr)) |
# 去重
| arr = np.array([1, 3, 5, 1, 8, 0, -23, 3]) |
| print(np.unique(arr)) |
# 数组的拼接
| arr1 = np.array([1, 2, 3]) |
| arr2 = np.array([4, 5, 6]) |
| print(np.concatenate((arr1, arr2))) |
# 数组分割
| arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) |
| print(np.split(arr, [3, 5])) |
# 调整形状
| arr = np.random.randint(1, 10, 20) |
| print(arr) |
| print(arr.reshape(4, 5)) |
# 案例练习
# 温度数据分析
某城市一周的最高气温(℃)为 [28, 30, 29, 31, 32, 30, 29]。
- 计算平均气温、最高气温和最低气温。
- 找出气温超过 30℃ 的天数。
| arr = np.array([28, 30, 29, 31, 32, 30, 29]) |
| print('平均天气:', np.mean(arr)) |
| print('最高气温:', np.max(arr)) |
| print('最低气温:', np.min(arr)) |
| print('气温超过30℃的天数:', np.sum(arr > 30)) |
# 学生成绩统计
某班级 5 名学生的数学成绩为 [85, 90, 78, 92, 88]。
- 计算成绩的平均分、中位数和标准差。
- 将成绩转换为百分制(假设满分为 100)。
| arr = np.array([85, 90, 78, 92, 88]) |
| print('平均成绩:', np.mean(arr)) |
| print('中位数:', np.median(arr)) |
| print('标准差:', np.std(arr)) |
| print('成绩转换为百分制:', arr / 100 * 100) |
# 数组变形
题目:创建一个 1 到 12 的一维数组,并转换为 (3, 4) 的二维数组。
- 计算每行的和与每列的平均值。
- 将数组展平为一维数组。
| arr = np.linspace(1, 12, 12, dtype=int) |
| arr = arr.reshape(3, 4) |
| print(arr) |
| print(arr.sum(axis=1)) |
| print(arr.mean(axis=0)) |
| print(arr.flatten()) |