提取矩阵中由相同行组成的子矩阵的实现方法
提取矩阵中由相同行组成的子矩阵的实现方法
嘿,我来帮你搞定这个问题~你现在的需求是把矩阵里所有相同的行归到一起,生成对应的子矩阵,但之前的嵌套循环只能两两匹配,没法把所有重复行都整合到同一个子矩阵里,而且还会出现重复输出的情况对吧?
下面给你两种实用的实现方法,都是基于NumPy的,能完美解决这个问题:
方法一:用字典分组(直观易懂)
我们可以把每一行转换成不可变的元组作为字典的键,然后把相同行都添加到对应键的列表里,最后再把每个列表转换成NumPy矩阵就行:
import numpy as np A = np.array([ [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.] ]) # 初始化字典用来分组 row_groups = {} for row in A: # 把行转成元组作为键(数组不能当字典键) row_key = tuple(row) if row_key not in row_groups: row_groups[row_key] = [] row_groups[row_key].append(row) # 把每个分组转成NumPy矩阵 sub_matrices = [np.vstack(group) for group in row_groups.values()] # 输出结果 print("子矩阵B:") print(sub_matrices[0]) print("\n子矩阵C:") print(sub_matrices[1])
方法二:用NumPy的unique函数(更简洁)
利用np.unique找到所有唯一行,再通过np.where定位每个唯一行在原矩阵中的位置,最后提取对应的行组成子矩阵:
import numpy as np A = np.array([ [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.] ]) # 获取唯一行以及每个行对应的索引标签 unique_rows, labels = np.unique(A, axis=0, return_inverse=True) # 按标签分组提取子矩阵 sub_matrices = [] for unique_row in unique_rows: # 找到所有和当前唯一行匹配的行索引 indices = np.where(labels == np.where((unique_rows == unique_row).all(axis=1))[0][0])[0] sub_matrix = A[indices] sub_matrices.append(sub_matrix) # 输出结果 print("子矩阵B:") print(sub_matrices[0]) print("\n子矩阵C:") print(sub_matrices[1])
这两种方法都能自动识别所有重复行的分组,不管原矩阵多大、有多少种重复行,都能准确提取对应的子矩阵~
备注:内容来源于stack exchange,提问作者Ludovica Spada Chiodo
相关产品推荐
相关产品推荐

