目录
相关阅读
方法一:使用切片操作
方法二:使用高级索引
方法三:使用条件筛选
方法四:使用 numpy 的 take 函数
相关阅读
OpenCV基础:矩阵的创建、检索与赋值-CSDN博客
OpenCV基础:图像运算-CSDN博客
以下是使用 numpy 获取子矩阵的几种常见方法:
方法一:使用切片操作
import numpy as np
# 创建一个示例矩阵
matrix = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
sub_matrix = matrix[0:2, 0:2]
print(sub_matrix)
代码解释:
- matrix[0:2, 0:2] 是切片操作,对于二维数组,第一个 0:2 表示行的范围,从第 0 行开始到第 2 行(不包括第 2 行),第二个 0:2 表示列的范围,从第 0 列开始到第 2 列(不包括第 2 列)。
- 切片操作的基本语法是 start:stop:step,其中 start 是起始索引,stop 是结束索引(不包括该索引对应的元素),step 是步长(默认为 1)。
运行结果:
方法二:使用高级索引
import numpy as np
# 创建一个示例矩阵
matrix = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
# 使用高级索引获取子矩阵,选取特定的行和列
rows = [0, 2]
cols = [1, 3]
sub_matrix = matrix[np.ix_(rows, cols)]
print(sub_matrix)
代码解释:
- np.ix_ 是 numpy 中的一个函数,它可以将两个一维整数数组转换为一个用于选择矩阵元素的索引器。
- np.ix_(rows, cols) 会生成一个索引器,用于选取 rows 中指定的行和 cols 中指定的列所构成的子矩阵。
运行结果:
方法三:使用条件筛选
import numpy as np
# 创建一个示例矩阵
matrix = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
# 筛选出元素大于 5 的元素所在的行和列形成的子矩阵
sub_matrix = matrix[matrix > 5]
print(sub_matrix)
代码解释:
- matrix > 5 会生成一个布尔型的数组,其中元素大于 5 的位置为 True,其余为 False。
- 当将这个布尔型数组作为索引时,会选取布尔型数组中为 True 的元素,在二维矩阵中,会返回一个一维数组,包含了满足条件的元素。
运行结果:
方法四:使用 numpy 的 take 函数
import numpy as np
# 创建一个示例矩阵
matrix = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
# 使用 take 函数获取子矩阵,选取第 0 行和第 2 行,第 1 列和第 3 列
sub_matrix = np.take(np.take(matrix, [0, 2], axis=0), [1, 3], axis=1)
print(sub_matrix)
代码解释:
- np.take(matrix, [0, 2], axis=0) 首先从矩阵matrix中选取第 0 行和第 2 行,得到一个新的矩阵。
- 然后 np.take(result, [1, 3], axis=1) 从新得到的矩阵中选取第 1 列和第 3 列,最终得到所需的子矩阵。
运行效果:
这些方法各有特点,可以根据不同的需求选择使用。切片操作最为直观和常用,适用于已知具体行和列范围的情况;高级索引 np.ix_ 可以灵活地选取不连续的行和列;条件筛选适用于根据元素的值来选取元素;np.take 函数在需要根据行和列的索引列表选取元素时比较方便。