基于首列实现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
相关产品推荐
相关产品推荐

