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

基于首列实现Numpy数组Outer Join并填充0的高效方法

Numpy高效实现基于第一列的外连接(无匹配填充0)

核心思路

利用Numpy的矢量化集合操作与索引匹配,完全规避转换为DataFrame的开销,适配高频重复调用场景。

实现代码

import numpy as np

a = np.array([
  [1, 0.2],
  [2, 0.5],
  [3, 0.8]])

b = np.array([
  [2, 0.4],
  [3, 0.7],
  [4, 1.3],
  [5, 2]])

# 拆分键与值列
keys_a, vals_a = a[:, 0], a[:, 1]
keys_b, vals_b = b[:, 0], b[:, 1]

# 获取所有唯一键并排序(保证结果有序)
all_keys = np.union1d(keys_a, keys_b)

# 初始化对齐后的向量,默认填充0
vals_a_aligned = np.zeros_like(all_keys, dtype=np.float64)
vals_b_aligned = np.zeros_like(all_keys, dtype=np.float64)

# 匹配索引并填充对应值
idx_a = np.searchsorted(all_keys, keys_a)
vals_a_aligned[idx_a] = vals_a

idx_b = np.searchsorted(all_keys, keys_b)
vals_b_aligned[idx_b] = vals_b

# 若需要合并为完整数组
c = np.column_stack((all_keys, vals_a_aligned, vals_b_aligned))

效率说明

  • 所有操作均为Numpy内置矢量化运算,无Python层循环,执行效率远高于Pandas的Join操作
  • np.union1d和np.searchsorted均为高效底层实现,时间复杂度为O(n log n),适配大规模数据处理
  • 若仅需两个对齐后的向量(无需完整数组),可直接使用vals_a_aligned和vals_b_aligned,省去合并步骤进一步提速

验证结果

运行后得到的c与需求一致(注:原需求中第三行第三列的1.7应为笔误,实际对应输入数组b的0.7):

array([[1. , 0.2, 0. ],
       [2. , 0.5, 0.4],
       [3. , 0.8, 0.7],
       [4. , 0. , 1.3],
       [5. , 0. , 2. ]])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:16:09