如何从二维NumPy数组中提取唯一值对应的第二行匹配值
二维数组按行分组匹配实现方案
核心逻辑:逐位对齐两行的同索引元素,以第一行的元素为分组键,收集对应位置第二行的取值,最后对每个分组的取值去重、保留首次出现的顺序,即可得到符合要求的结果。
方法1:纯Python原生实现(无依赖)
不需要安装任何第三方库,适合小规模数据处理:
# 输入的原始二维数组 source_arr = [ [1, 4, 4, 6, 6, 6, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 11, 11, 11, 11, 11], [0, 0, 1, 0, 1, 4, 0, 1, 4, 6, 0, 1, 4, 6, 8, 5, 0, 1, 4, 6, 8] ] key_row, val_row = source_arr[0], source_arr[1] group_result = {} # 逐位配对遍历 for key, val in zip(key_row, val_row): if key not in group_result: group_result[key] = [] # 仅当值未在当前分组出现过时追加,保证顺序且去重 if val not in group_result[key]: group_result[key].append(val) print(group_result)
运行输出:
{1: [0], 4: [0, 1], 6: [0, 1, 4], 8: [0, 1, 4, 6], 9: [0, 1, 4, 6, 8], 10: [5], 11: [0, 1, 4, 6, 8]}
输出结果和给出的示例规则完全匹配,示例中仅展示了1、4、6、8、9五个键的分组结果,其余键的结果也符合分组逻辑,不需要的话直接过滤删除即可。
方法2:NumPy向量化实现(适合大数据量)
如果数组规模较大,用NumPy处理运行效率更高:
import numpy as np source_arr = np.array([ [1, 4, 4, 6, 6, 6, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 11, 11, 11, 11, 11], [0, 0, 1, 0, 1, 4, 0, 1, 4, 6, 0, 1, 4, 6, 8, 5, 0, 1, 4, 6, 8] ]) key_row, val_row = source_arr[0], source_arr[1] group_result = {} for unique_key in np.unique(key_row): # 筛选当前key对应的所有第二行取值 match_values = val_row[key_row == unique_key] # Python3.7+字典默认保留插入顺序,用dict.fromkeys可快速去重保序 group_result[int(unique_key)] = list(dict.fromkeys(match_values.tolist())) print(group_result)
运行结果和原生实现完全一致。
注意事项
- 遍历配对时不要打乱两行的索引对应关系,否则会出现匹配错误
- 如果需要和示例一样保持值的排列顺序,不要直接用
set()做去重,集合默认无序会打乱值的顺序 - 如果只需要指定键的结果,遍历完成后直接过滤字典的键即可
内容的提问来源于stack exchange,提问作者Fidi Naj
相关产品推荐
相关产品推荐

