迭代处理矩阵子矩阵时,如何获取元素在原矩阵中的索引?
解决子矩阵元素映射回原矩阵索引的问题
嘿,我完全懂你这个痛点——当你反复切割矩阵、处理子矩阵时,numpy默认返回的元素索引都是相对于当前子矩阵的,要对应回原矩阵的位置确实得费点心思。这里给你两种实用的解决方案,适配不同的迭代场景:
方法一:跟踪行列偏移量
如果你的迭代操作都是从矩阵的头部/尾部连续删除行列(比如x[1:, 1:]这种切片),那最简单的方式就是每次记录切割带来的行、列偏移量,最后把偏移量加到子矩阵的索引上,就能得到原矩阵的位置了。
举个具体的例子:
import numpy as np # 创建原矩阵 x = np.arange(9).reshape(3, 3) # 第一次切割:取x[1:, 1:],记录偏移量 row_offset = 1 # 切掉了前1行,所以子矩阵的行索引要加1才是原矩阵行号 col_offset = 1 # 切掉了前1列,同理列索引要加1 sub_x = x[row_offset:, col_offset:] # 找到子矩阵中值为8的元素索引 sub_row, sub_col = np.where(sub_x == 8) # 转换为原矩阵索引 original_row = sub_row[0] + row_offset original_col = sub_col[0] + col_offset print(f"原矩阵索引:({original_row}, {original_col})") # 输出 (2, 2)
如果是多次迭代切割,只需要每次更新偏移量就行:
# 第一次切割:切掉前1行 row_offset = 1 col_offset = 0 sub_x1 = x[row_offset:, col_offset:] # 第二次切割:在子矩阵里切掉前1列 col_offset += 1 # 列偏移量累加1 sub_x2 = sub_x1[:, col_offset:] sub_row, sub_col = np.where(sub_x2 == 8) original_row = sub_row[0] + row_offset original_col = sub_col[0] + col_offset print(f"原矩阵索引:({original_row}, {original_col})") # 依然是 (2, 2)
方法二:维护原矩阵的保留行列索引
如果你的迭代操作是随机删除任意行列(比如删掉中间的某几行/列),偏移量的方法就不好用了。这时候可以维护一个列表,记录原矩阵中还没被删除的行、列索引,直接通过这个列表映射子矩阵索引到原矩阵索引。
示例代码:
import numpy as np x = np.arange(9).reshape(3, 3) # 初始化:保留所有行和列的原索引 keep_rows = np.array([0, 1, 2]) keep_cols = np.array([0, 1, 2]) # 第一次删除:删掉第0行(对应原矩阵的行0) keep_rows = keep_rows[1:] # 现在保留的行是原矩阵的1、2行 # 第二次删除:删掉第0列(对应原矩阵的列0) keep_cols = keep_cols[1:] # 现在保留的列是原矩阵的1、2列 # 生成子矩阵(其实不用真的切割,只是用保留索引定位) sub_x = x[keep_rows][:, keep_cols] # 找到子矩阵中值为8的元素索引 sub_row_idx, sub_col_idx = np.where(sub_x == 8) # 通过保留索引直接获取原矩阵位置 original_row = keep_rows[sub_row_idx[0]] original_col = keep_cols[sub_col_idx[0]] print(f"原矩阵索引:({original_row}, {original_col})") # 输出 (2, 2)
这种方法的优势在于,不管你怎么删除行列(哪怕是跳着删),都能准确映射回原矩阵的索引,适合复杂的迭代场景。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

