Numpy中的切片操作

NumPy里,切片操作是从数组里选取特定元素的强大手段。下面会从基础概念、一维数组切片、二维数组切片、高级切片技巧等方面来详细介绍。

基础概念

NumPy数组的切片语法和Python列表的切片语法相似,不过NumPy的切片操作更为强大,能够处理多维数组。基本的切片语法为array[start:stop:step],其中:

  • start:切片起始位置的索引,默认值为 0。
  • stop:切片结束位置的索引(不包含该位置的元素),默认值是数组的长度。
  • step:切片的步长,默认值为 1。

一维数组切片

对于一维NumPy数组,切片操作和Python列表的切片操作基本相同。

import numpy as np

# 创建一维数组
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])

# 从索引 2 到索引 5(不包含 5)
print(arr[2:5])  

# 从索引 0 到索引 5(不包含 5),步长为 2
print(arr[0:5:2])  

# 从索引 2 到数组末尾
print(arr[2:])  

# 从数组开头到索引 5(不包含 5)
print(arr[:5])  

上述代码的输出结果如下:

[2 3 4]
[0 2 4]
[2 3 4 5 6 7 8]
[0 1 2 3 4]

二维数组切片

处理二维NumPy数组时,需要为每一个维度指定切片范围,语法为array[start_row:stop_row:step_row, start_col:stop_col:step_col]

import numpy as np

# 创建二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 选取第二行(索引为 1),: 是一个通配符,表示在列维度上选取所有的列。
print(arr_2d[1:2, :])  

# 选取第二列(索引为 1),: 是一个通配符,表示在行维度上选取所有的行。
print(arr_2d[:, 1:2])  

# 选取子数组,从第二行到第三行(索引 1 到 3,不包含 3),从第二列到第三列(索引 1 到 3,不包含 3)
print(arr_2d[1:3, 1:3])  

上述代码的输出结果如下:

[[4 5 6]]
[[2]
 [5]
 [8]]
[[5 6]
 [8 9]]

高级切片技巧

  • 负索引:负索引用于从数组末尾开始计数。例如,-1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
# 选取最后一个元素
print(arr[-1])  

# 从倒数第二个元素到数组末尾
print(arr[-2:])  

上述代码的输出结果如下:

5
[4 5]
  • 省略号(...:在处理多维数组时,如果不想为每个维度都指定切片范围,可以使用省略号来表示“选取所有剩余的维度”。
import numpy as np

arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 全选前两个维度的所有元素,以及第三维的所有元素
print(arr_3d[..., :])  

上述代码的输出结果如下:

[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]
  • 布尔索引:可以使用布尔数组来进行切片操作,布尔数组的长度必须和被切片数组的对应维度长度一致。
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
# 创建布尔数组
mask = arr > 3
# 使用布尔数组进行切片
print(arr[mask])  

上述代码的输出结果如下:

[4 5]

注意事项

  • 切片返回的是视图NumPy数组的切片操作返回的是原数组的视图,而不是副本。这意味着对切片结果的修改会影响原数组,反之亦然。如果需要创建副本,可以使用copy()方法。
import numpy as np

arr = np.array([1, 2, 3, 4, 5])
# 创建切片视图
slice_view = arr[1:3]
# 修改切片视图
slice_view[0] = 10
# 原数组也会被修改
print(arr)  

上述代码的输出结果如下:

[ 1 10  3  4  5]

通过这些切片操作,你能够灵活地从NumPy数组中选取所需的元素,满足不同的数据处理需求。

posted @ 2025-04-12 23:53  icuic  阅读(35)  评论(0)    收藏  举报