跳至主要內容

索引与切片

blacklad2024年8月28日大约 4 分钟PythonPythonNumPy

索引与切片

ndarrays(N维数组)支持多种索引和切片操作。

一、索引

单元素索引

一维

数组的索引同列表一样,也是从0开始,arr[2] 返回第 3 个元素的值,arr[-2] 返回倒数第 2 个元素的值。

arr = np.arange(10)
print(arr)
print(arr[2])
print(arr[-2])
[0 1 2 3 4 5 6 7 8 9]
2
8

多维

先将 arr 转换为 2 行 5 列的数组。获取第2 行,第 4 列的元素。

arr.shape = (2, 5) 
print(arr)
print(arr[1,3])
[[0 1 2 3 4]
 [5 6 7 8 9]]
8

也可以获取第2行所有的元素。

print(arr[1])
[5 6 7 8 9]

切片

NumPy 的切片将 Python 的基本切片扩展到 n 维,方便的从数组中提取到需要的子集。

对于 NumPy 通过基本切片生成的所有数组始终是原始数组的视图,视图会共用同一份数据,修改切片数组会影响原始的数组。

而 Python 序列的切片会直接创建一个副本。

切片的基本语法为 arr[start:stop:step],用于指定从 startstop 之间的元素,步长为 step

  • start 是起始索引,不指定是从 0 开始。
  • stop 是结束索引(不包括),不指定时到结尾最后一个元素。
  • step 是步长,步长为正时,从左向右取值。步长为负时,反向取值,不指定时,默认为1。

一维切片

arr = np.arange(10)

# 从索引2到索引5的切片
print(arr[2:5])
[2 3 4]

从起始到索引5的切片

print(arr[:5])
[0 1 2 3 4]

从索引5到结尾的切片

print(arr[5:])
[5 6 7 8 9]

步长为2的切片

print(arr[::2])
[0 2 4 6 8]

反向切片

print(arr[::-1])
[9 8 7 6 5 4 3 2 1 0]

二维切片

arr = np.arange(12).reshape((3,4))
print(arr)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

提取子矩阵,第二行到第三行,第二列到第三列。

print(arr[1:3, 1:3])
[[ 5  6]
 [ 9 10]]

提取第二行

print(arr[1, :])
[4 5 6 7]

三维切片

arr = np.arange(12).reshape((3,2,2))
[[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]]

提取特定的平面

print(arr[1, :, :])
[[4 5]
 [6 7]]

提取特定的列

print(arr[:, :, 1])
[[ 1  3]
 [ 5  7]
 [ 9 11]]

省略号

通过省略号 ... 插入尽可能多的完整切片( : )以将多维切片扩展到所有维度。替换多个连续的 :

对于上面的多维数组的例子,使用省略号可以简化写法,得到同样的结果。

print(arr[..., 1])
[[ 1  3]
 [ 5  7]
 [ 9 11]]

最多只能有一个省略号

二、高级索引

使用整数数组、布尔数组、花式索引和组合索引来访问数组的元素。

高级索引总是返回数据的副本

整数数组索引

使用整数数组索引可以直接从数组中提取特定的元素。

  1. 通过指定索引数组来获取元素
arr = np.array([10, 20, 30, 40, 50])
indices = [0, 2, 2, 4]
print(arr[indices])
[10 30 30 50]
  1. 通过指定行索引数组和列索引数组来获取元素
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[[0, 1, 2], [2, 0, 1]]) 
[3 4 8]
  1. 使用行和列索引数组获取子数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[[0,2], [1, 2]]) 
print("使用 np.ix_():")
print(arr[np.ix_([0,2], [1, 2])])  
[2 9]
使用 np.ix_():
[[2 3]
 [8 9]]

布尔数组索引

使用布尔数组索引可以根据条件选择元素。

  1. 获取偶数列的数字,使用布尔索引数组获取元素
# 生成布尔索引
bool_idx = (arr % 2 == 0)
print(bool_idx)

print(arr[bool_idx])
[ True False  True False  True False  True False  True False]
[0 2 4 6 8]

组合索引

您可以将切片、布尔数组和整数数组索引结合起来使用,以进行更复杂的访问。

  1. 选择所有二维数组的第一行中的奇数元素
arr3d = np.array([[[0, 1, 2], [3, 4, 5]],
                  [[6, 7, 8], [9, 10, 11]],
                  [[12, 13, 14], [15, 16, 17]]])


print(arr3d[:, 0, arr3d[0, 0, :] % 2 == 1]) 
[[ 1]
 [ 7]
 [13]]
上次编辑于: 2024/8/28 13:55:46
贡献者: blacklad