编程学习网 > 编程语言 > Python > Python切片技巧,带你轻松提取数组子集!
2024
08-24

Python切片技巧,带你轻松提取数组子集!


在数据分析和科学计算中,灵活地处理数组数据是非常重要的技能。Python的Numpy库提供了强大的数组操作功能,其中数组切片(slicing)是一个非常重要且常用的技术。通过数组切片,可以轻松地提取数组的子集、修改数组中的部分数据,甚至可以通过切片高效地进行数据重组和分析。本文将详细介绍Numpy数组切片的各种技巧和应用场景,并通过丰富的示例代码帮助你掌握这一技能。

数组切片的基本概念

数组切片是一种通过指定索引范围来提取数组部分数据的操作方式。Numpy数组的切片操作类似于Python列表的切片,但功能更加丰富。切片可以用于一维数组、二维数组,甚至更高维的数组。

切片的语法

Numpy数组的切片语法如下:array[start:stop:step]

start:起始索引,包含该索引,默认为0。

stop:结束索引,不包含该索引,默认为数组长度。

step:步长,默认为1。

可以通过调整start、stop和step的值来提取数组中的子集。

一维数组切片首先,来看一个简单的一维数组的切片操作:

import numpy as np


# 创建一维数组
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])

# 提取索引2到5之间的元素
subset = arr[2:6]
print("索引2到5之间的子集:", subset)

# 每隔一个元素提取一次
subset_step = arr[::2]
print("每隔一个元素提取一次:", subset_step)

# 反向提取数组
subset_reverse = arr[::-1]
print("反向提取数组:", subset_reverse)
输出结果:索引2到5之间的子集: [30 40 50 60]
每隔一个元素提取一次: [10 30 50 70 90]
反向提取数组: [90 80 70 60 50 40 30 20 10]

在这个示例中,展示了基本的一维数组切片操作,包括按范围提取、按步长提取以及反向提取数组的方式。二维数组切片在二维数组中,切片操作可以用于提取特定的行、列或子矩阵。切片操作的语法与一维数组类似,只不过需要为每个维度分别指定切片参数。

提取二维数组的子集

# 创建二维数组

arr2d = np.array([[1, 2, 3, 4],
                  [5, 6, 7, 8],
                  [9, 10, 11, 12],
                  [13, 14, 15, 16]])

# 提取前两行和前两列
subset_2d = arr2d[:2, :2]
print("前两行和前两列的子集:\n", subset_2d)

# 提取第三行的所有元素
third_row = arr2d[2, :]
print("第三行的元素:", third_row)

# 提取第二列的所有元素
second_column = arr2d[:, 1]
print("第二列的元素:", second_column)
输出结果:前两行和前两列的子集:
 [[1 2]
 [5 6]]

第三行的元素: [ 9 10 11 12]

第二列的元素: [ 2  6 10 14]

在这个示例中,通过切片操作提取了二维数组的部分数据,包括子矩阵、特定行和特定列。

提取矩阵的子矩阵

# 提取一个2x2的子矩阵

sub_matrix = arr2d[1:3, 1:3]
print("2x2的子矩阵:\n", sub_matrix)
输出结果:2x2的子矩阵:
 [[ 6  7]
 [10 11]]

这个示例展示了如何从一个4x4的矩阵中提取一个2x2的子矩阵。高维数组的切片对于更高维的数组(例如三维数组),切片操作同样适用。只需为每个维度指定相应的切片范围即可。

三维数组的切片

# 创建一个三维数组

arr3d = np.array([[[1, 2, 3],
                   [4, 5, 6]],
                  [[7, 8, 9],
                   [10, 11, 12]],
                  [[13, 14, 15],
                   [16, 17, 18]]])

# 提取第一个二维子数组
subset_3d = arr3d[0, :, :]
print("第一个二维子数组:\n", subset_3d)

# 提取第三维度的所有元素
third_dim_elements = arr3d[:, :, 2]
print("第三维度的元素:\n", third_dim_elements)
输出结果:第一个二维子数组:
 [[1 2 3]
 [4 5 6]]

第三维度的元素:
 [[ 3  6]
 [ 9 12]
 [15 18]]

在这个示例中,展示了如何对三维数组进行切片操作,包括提取二维子数组和提取特定维度的元素。切片的高级应用除了基本的切片操作,Numpy还支持一些高级的切片技巧,这些技巧在复杂的数据操作和分析中非常有用。

多维数组的步长切片

# 创建一个6x6的二维数组

arr_large = np.arange(36).reshape(6, 6)
print("原始数组:\n", arr_large)

# 每隔两行两列提取一次
step_slice = arr_large[::2, ::2]
print("每隔两行两列提取一次:\n", step_slice)
输出结果:原始数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13 14 15 16 17]
  [18 19 20 21 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

每隔两行两列提取一次:
 [[ 0  2  4]
  [12 14 16]
  [24 26 28]]

在这个示例中,展示了如何通过步长切片来提取二维数组的部分数据,这种操作可以用来提取数据的子样本或进行降采样。通过切片修改数组切片不仅可以用来提取数据,还可以用来修改数组中的部分数据。

# 修改数组的部分元素

arr_large[2:4, 2:4] = 99
print("修改后的数组:\n", arr_large)
输出结果:修改后的数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13 99 99 16 17]
  [18 19 99 99 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

在这个示例中,使用切片操作修改了数组中的部分数据,这在数据清洗和预处理过程中非常常见。通过切片提取对角线元素有时需要提取矩阵的对角线元素,Numpy中的切片和高级索引结合使用,可以轻松实现这一点。

# 提取矩阵的对角线元素

diagonal_elements = arr_large[np.arange(6), np.arange(6)]
print("对角线元素:", diagonal_elements)
输出结果:对角线元素: [ 0  7 99 99 28 35]

在这个示例中,使用Numpy的arange函数结合索引操作,提取出了矩阵的对角线元素。切片与数组复制在Numpy中,切片通常会返回原数组的视图(view),而不是数据的副本。这意味着对切片的修改会影响原数组。为了避免这种情况,可以显式地创建数组的副本。

数组视图与副本

# 创建一个数组视图

arr_view = arr_large[2:4, 2:4

]
arr_view[:] = 0
print("修改后的视图:\n", arr_view)
print("原始数组:\n", arr_large)

# 创建一个数组副本
arr_copy = arr_large[2:4, 2:4].copy()
arr_copy[:] = 99
print("修改后的副本:\n", arr_copy)
print("原始数组:\n", arr_large)
输出结果:修改后的视图:
 [[0 0]
  [0 0]]
原始数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13  0  0 16 17]
  [18 19  0  0 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

修改后的副本:
 [[99 99]
  [99 99]]
原始数组:
 [[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13  0  0 16 17]
  [18 19  0  0 22 23]
  [24 25 26 27 28 29]
  [30 31 32 33 34 35]]

在这个示例中,展示了视图和副本的区别。当修改视图时,原始数组也发生了变化;而当修改副本时,原始数组保持不变。

总结

本文深入探讨了Python Numpy库中的数组切片操作,展示了如何通过切片技术高效地提取数组子集和修改数组数据。详细介绍了一维、二维乃至高维数组的切片方法,并通过实际案例演示了切片的多种应用场景,如按步长切片、反向切片、提取对角线元素等。此外,还讨论了切片操作与数组视图和副本的关系,帮助理解和避免潜在的数据修改问题。掌握这些切片技巧,能够更加灵活地处理数据,提高数据分析的效率和准确性。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取