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
数组中选取所需的元素,满足不同的数据处理需求。