934 字
5 分钟
数据分析|索引与切片

6.1 索引与切片概述
索引与切片是从数组中提取目标数据的核心手段。NumPy 的索引机制比 Python 原生列表更加强大,不仅支持常规的位置索引和切片,还支持布尔条件筛选等高级用法。
下表列出了常用的索引/切片类型及其用法:
| 类型 | 描述 |
|---|---|
| 基本索引 | 通过整数索引直接访问元素,索引从 0 开始 |
| 行/列切片 | 使用冒号 : 切片语法选择行或列的子集 |
| 连续切片 | 从起始索引到结束索引按步长切片 |
使用 slice 函数 | 通过 slice(start, stop, step) 定义切片规则 |
| 布尔索引 | 通过布尔条件筛选满足条件的元素,支持逻辑运算符 &、| |
6.2 一维数组的索引与切片
一维数组的索引与切片规则和 Python 列表完全一致。
import numpy as np
# 创建一维数组arr = np.array([17, 63, 17, 8, 99, 7, 27, 14, 76, 59, 26, 4, 75, 76, 62, 78, 84, 58, 95, 33])print(arr)输出:
[17 63 17 8 99 7 27 14 76 59 26 4 75 76 62 78 84 58 95 33]基本索引与各类切片:
print(arr[0]) # 索引第一个元素print(arr[:]) # 获取全部数据print(arr[2:5]) # start:end+1,左闭右开区间print(arr[slice(2, 15, 3)]) # start, end+1, stepprint(arr[(arr > 10) & (arr < 70)]) # 布尔索引输出:
17[17 63 17 8 99 7 27 14 76 59 26 4 75 76 62 78 84 58 95 33][17 8 99][17 7 76 4 62][17 63 17 27 14 59 26 62 58 33]要点说明:
arr[0]:通过整数下标直接访问单个元素。arr[:]:不传参数表示获取全部元素。arr[2:5]:取索引 2 到 4 的元素(左闭右开)。arr[slice(2, 15, 3)]:等价于arr[2:15:3],从索引 2 开始每隔 3 个取一个,到索引 14 为止。arr[(arr > 10) & (arr < 70)]:布尔索引,筛选出同时满足大于 10 且小于 70 的所有元素。注意使用&而非and。
6.3 二维数组的索引与切片
二维数组的索引需要同时指定行索引和列索引,用逗号分隔。
# 创建二维数组(4行8列)arr = np.random.randint(1, 100, (4, 8))print(arr)输出:
[[11 7 76 19 4 78 18 44] [17 19 80 91 60 72 76 30] [46 7 64 79 25 19 94 34] [79 43 95 4 19 71 53 23]]各种索引与切片操作:
print(arr[1, 3]) # 索引第2行第4列的元素print(arr[1, :]) # 获取第2行的所有数据print(arr[1, 2:5]) # 获取第2行的第3到第5个元素print(arr[arr > 50]) # 获取所有大于50的元素print(arr[2][arr[2] > 50]) # 获取第3行中大于50的元素print(arr[:, 3]) # 获取第4列的所有元素输出:
91[17 19 80 91 60 72 76 30][80 91 60][76 78 80 91 60 72 76 64 79 94 79 95 71 53][64 79 94][19 91 79 4]要点说明:
arr[1, 3]:先行后列,取第 2 行第 4 列的单个元素。arr[1, :]:取第 2 行的全部列。冒号:表示”全部”。arr[1, 2:5]:取第 2 行中索引 2 到 4 的元素。arr[arr > 50]:对整个数组进行布尔筛选,返回一维数组(所有满足条件的元素展平排列)。arr[2][arr[2] > 50]:先取第 3 行,再在该行内筛选大于 50 的元素。arr[:, 3]:冒号表示取所有行,3表示第 4 列。
6.4 本节小结
本节完成了以下内容:
- 掌握了一维数组的基本索引、切片、
slice函数和布尔索引。 - 掌握了二维数组的行列索引、行列切片和条件筛选。
- 理解了布尔索引中使用
&(与)、|(或)进行组合条件筛选。
下一节我们将学习 ndarray 的运算,包括算术运算、广播机制和矩阵乘法。
数据分析
连载中分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 95 天
部分内容可能已过时
评论