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

如何用Numpy内置函数高效实现数组匹配合并与缺失值填充?

基于Numpy的高效数组合并方案(内连接/外连接)

因为两个数组的索引列已按升序排列,我们可以利用Numpy的集合操作和搜索函数实现高效合并,完全避免循环带来的性能损耗。

1. 内连接实现

先提取两个数组的索引列,找到共同索引,再定位这些索引在原数组中的位置,最后合并对应列:

import numpy as np

a = np.array([[1,2],[3,2], [5,0], [6,4]])
b = np.array([[1,10],[6,30], [5,20], [7,80]])

# 提取索引列
idx_a = a[:, 0]
idx_b = b[:, 0]

# 找到共同索引
common_idx = np.intersect1d(idx_a, idx_b)

# 利用升序特性,用searchsorted高效定位索引位置
pos_a = np.searchsorted(idx_a, common_idx)
pos_b = np.searchsorted(idx_b, common_idx)

# 合并列:索引列 + a的其他列 + b的其他列
inner_join = np.hstack([common_idx[:, None], a[pos_a, 1:], b[pos_b, 1:]])
print(inner_join)

输出结果:

[[ 1  2 10]
 [ 5  0 20]
 [ 6  4 30]]

2. 外连接实现

先获取所有唯一索引,再为每个索引在两个数组中查找对应行,不存在的位置用np.nan填充,最后拼接结果:

# 获取所有唯一索引(保持升序)
all_idx = np.union1d(idx_a, idx_b)

# 初始化结果数组,设为float类型以支持nan填充
result = np.full((len(all_idx), 1 + a.shape[1]-1 + b.shape[1]-1), np.nan)
result[:, 0] = all_idx

# 填充a数组的内容
pos_a = np.searchsorted(idx_a, all_idx)
valid_a = pos_a < len(idx_a)  # 过滤不存在于a的索引
result[valid_a, 1:1+a.shape[1]-1] = a[pos_a[valid_a], 1:]

# 填充b数组的内容
pos_b = np.searchsorted(idx_b, all_idx)
valid_b = pos_b < len(idx_b)  # 过滤不存在于b的索引
result[valid_b, 1+a.shape[1]-1:] = b[pos_b[valid_b], 1:]

print(result)

输出结果:

[[ 1.  2. 10.]
 [ 3.  2. nan]
 [ 5.  0. 20.]
 [ 6.  4. 30.]
 [ 7. nan 80.]]

关键优势

  • 基于Numpy向量化操作,底层为C实现,比循环效率高数个数量级,适配大数组场景
  • np.searchsorted时间复杂度为O(log n),结合集合操作,整体性能优异
  • 兼容任意宽度的输入数组(只需保证索引列为第一列且升序)

内容的提问来源于stack exchange,提问作者Alosapien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:40