You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并并排序以A为共同索引的多组A、B数组列

整合多数组索引与测量值的解决方案

问题描述

我有一个长度为n的数组列表,每个数组包含两列:

  • A)取值范围1-500的索引值
  • B)测量值
    各数组的A列存在差异,部分索引值缺失或有额外值。需要生成一个满足以下要求的大型数组:
  1. 包含一列整合所有索引值的A列
  2. 所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:35:23