合并并排序以A为共同索引的多组A、B数组列
整合多数组索引与测量值的解决方案
问题描述
我有一个长度为n的数组列表,每个数组包含两列:
- A)取值范围1-500的索引值
- B)测量值
各数组的A列存在差异,部分索引值缺失或有额外值。需要生成一个满足以下要求的大型数组:
- 包含一列整合所有索引值的A列
- 所有B列(测量值)按对应索引值匹配排序,缺失值用
0或nan填充
示例输入
import numpy as np arr1 = np.array([[ 25, 64], [ 45, 26]]) arr2 = np.array([[ 8, 54], [ 25, 2], [ 45, 84], [128, 22]]) arr3 = np.array([[ 17, 530], [255, 25]])
期望输出
dreamArr = np.array([[ 8, 0, 54, 0], [ 17, 0, 0, 530], [ 25, 64, 2, 0], [ 45, 26, 84, 0], [128, 0, 22, 0], [255, 0, 0, 25]])
我曾尝试创建np.zeros()数组并替换子列,但遇到阻碍;还尝试通过np.vstack()获取所有A值,经np.unique去重、np.sort排序后仍无法推进,求可行解决方案。
解决方案
方法一:使用Pandas(简洁高效)
Pandas的索引对齐特性完美适配这类需求,代码量少且易维护:
import numpy as np import pandas as pd # 将每个数组转为DataFrame,以A列作为索引 df_list = [] for i, arr in enumerate([arr1, arr2, arr3], start=1): df = pd.DataFrame(arr, columns=['A', f'arr{i}']).set_index('A') df_list.append(df) # 合并所有DataFrame,缺失值填充0,排序后转回numpy数组 merged_df = pd.concat(df_list, axis=1).fillna(0).sort_index().reset_index() dreamArr = merged_df.to_numpy(dtype=int) print(dreamArr)
方法二:纯Numpy实现
如果不想引入Pandas依赖,可以用字典映射+索引遍历的方式实现:
import numpy as np # 收集所有唯一索引并排序 all_indices = np.unique(np.concatenate([arr[:, 0] for arr in [arr1, arr2, arr3]])) n_rows = len(all_indices) n_cols = len([arr1, arr2, arr3]) + 1 # 初始化结果数组,默认填充0 result = np.zeros((n_rows, n_cols), dtype=int) result[:, 0] = all_indices # 为每个数组建立索引-值的映射字典 arr_maps = [dict(arr) for arr in [arr1, arr2, arr3]] # 遍历填充每一列 for col_idx, arr_map in enumerate(arr_maps, start=1): for row_idx, idx in enumerate(all_indices): result[row_idx, col_idx] = arr_map.get(idx, 0) print(result)
通用化版本(支持任意数量输入数组)
如果数组列表长度不固定,用循环批量处理:
import numpy as np # 假设所有输入数组都放在这个列表里 arr_list = [arr1, arr2, arr3] # 提取并整理所有唯一索引 all_indices = np.unique(np.concatenate([arr[:, 0] for arr in arr_list])) n_rows = len(all_indices) n_cols = len(arr_list) + 1 # 初始化结果数组 result = np.zeros((n_rows, n_cols), dtype=int) result[:, 0] = all_indices # 批量填充每一列的测量值 for col_idx, arr in enumerate(arr_list, start=1): arr_map = dict(arr) result[:, col_idx] = [arr_map.get(idx, 0) for idx in all_indices] print(result)
内容的提问来源于stack exchange,提问作者jeanssen
相关产品推荐
相关产品推荐

