Python中如何根据二进制矩阵W的非零坐标提取矩阵S的对应子矩阵
实现方案
你可以直接使用Numpy的布尔索引特性实现需求,仅需一行代码就能生成所有子矩阵,无需逐列编写循环,也能解决空数组初始化的问题:
import numpy as np # 输入转换为Numpy数组(如果本身已是数组可跳过此步) S = np.array([[1,1],[1,2],[1,3],[1,4],[1,5]]) W = np.array([[1,0,0],[1,1,0],[1,1,1],[0,1,1],[0,0,1]]) # 生成所有子矩阵列表,S_list[0]对应S_1,S_list[1]对应S_2,以此类推 S_list = [S[W[:, col].astype(bool)] for col in range(W.shape[1])] # 可按需单独赋值给对应变量 S_1, S_2, S_3 = S_list
逻辑说明
W[:, col].astype(bool)会提取W的第col列,将数值1转为True、0转为False,得到行筛选掩码- 直接用掩码索引S的行维度,会自动提取所有掩码为
True位置的行,无需手动循环堆叠,即便某列全为0也会返回合法的空二维数组,不会出现初始化错误 - 你原有写法中用
S[0,:]占位初始化的逻辑存在bug:如果第0行不属于当前列的选中范围,最终结果会多出来一行冗余数据,本方案完全规避了该问题
输出验证
运行以下代码可打印结果核对:
for idx, sub_mat in enumerate(S_list, 1): print(f"S_{idx} = \n{sub_mat}\n")
输出结果和你预期一致:
S_1 = [[1 1] [1 2] [1 3]] S_2 = [[1 2] [1 3] [1 4]] S_3 = [[1 3] [1 4] [1 5]]
内容的提问来源于stack exchange,提问作者User20354
相关产品推荐
相关产品推荐

