如何获取Eigen稠密矩阵中满足条件的行列索引?
从稠密矩阵提取满足条件的稀疏索引
嘿,这个需求太常见啦!从稠密矩阵里快速揪出满足特定条件的行/列索引,其实不用绕布尔矩阵转稀疏再删值的弯路,用合适的工具能一步到位,效率还高。我拿你给的例子来一步步演示:
方法一:用NumPy高效实现(推荐)
如果你用的是NumPy矩阵(这也是处理数值矩阵的常规选择),np.where()函数就是专门干这个的——直接返回所有满足条件的元素的行、列索引:
import numpy as np # 你的示例稠密矩阵 dense_mat = np.array([[1,5,2],[7,6,3],[2,3,8]]) # 找出所有值大于4的元素的行、列索引 rows, cols = np.where(dense_mat > 4) # 转换成你要的(行,列)元组列表 target_indices = list(zip(rows, cols)) print(target_indices) # 输出:[(0, 1), (1, 0), (1, 1), (2, 2)]
补充:如果需要构建稀疏矩阵
要是你后续需要把这些索引转换成稀疏矩阵,也可以直接用这些结果,不用先搞布尔矩阵:
from scipy.sparse import coo_matrix # 构建值全为1的稀疏矩阵(和你示例里的布尔转稀疏结果一致) sparse_mat = coo_matrix((np.ones_like(rows), (rows, cols)), shape=dense_mat.shape) # 要是之后还需要提取索引,直接取 sparse_mat.row 和 sparse_mat.col 就行
方法二:纯Python列表实现(无依赖)
如果你的矩阵是纯Python嵌套列表,用列表推导式也能轻松搞定:
dense_mat = [[1,5,2],[7,6,3],[2,3,8]] # 遍历每行每列,筛选出值大于4的索引 target_indices = [(i, j) for i, row in enumerate(dense_mat) for j, val in enumerate(row) if val > 4] print(target_indices) # 同样得到:[(0, 1), (1, 0), (1, 1), (2, 2)]
对比你原来的思路,这两种方法都省掉了中间构建布尔矩阵、转稀疏再删除值的步骤,尤其是处理大矩阵时,内存占用和计算效率都会好很多~
内容的提问来源于stack exchange,提问作者Aerys.L
相关产品推荐
相关产品推荐

