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

如何以Pythonic方式实现NumPy数组的左连接?

NumPy数组实现左连接的Pythonic方法

场景说明

已知两个二维NumPy数组:

  • a.shape = (20, 2),第一列为键(取值0~19),第二列为需要匹配的值
  • b.shape = (200, 3),第一列为相同范围的键,需要将a中对应键的第二列值左连接到b中(保留b所有行,匹配对应键的值)

方法1:键连续且有序时(最简洁)

如果a的第一列是0到19按顺序排列(即a[:,0] == np.arange(20)),可以直接用索引匹配:

import numpy as np

# 示例数据
a = np.array([[i, i * 10] for i in range(20)])
b = np.array([[np.random.randint(0, 20), np.random.rand(), np.random.rand()] for _ in range(200)])

# 提取匹配值并拼接
matched_vals = a[b[:, 0], 1]
result = np.hstack([b, matched_vals.reshape(-1, 1)])

原理:b[:,0]的每个元素都是0~19的键,直接作为行索引取出a的第二列值,再通过reshape转为列向量后与b水平拼接。

方法2:键无序时(通用解法)

如果a的第一列是乱序的,有两种高效实现方式:

方式A:字典映射(易读性优先)

# 构建键-值映射字典
key_map = dict(zip(a[:, 0], a[:, 1]))
# 批量匹配b中的键
matched_vals = np.array([key_map[key] for key in b[:, 0]])
# 拼接结果
result = np.hstack([b, matched_vals.reshape(-1, 1)])

方式B:排序+搜索(性能优先,适合大数据)

# 按键对a排序
sorted_idx = np.argsort(a[:, 0])
sorted_a = a[sorted_idx]
# 查找b中每个键在排序后a中的位置
pos = np.searchsorted(sorted_a[:, 0], b[:, 0])
# 提取对应值
matched_vals = sorted_a[pos, 1]
# 拼接结果
result = np.hstack([b, matched_vals.reshape(-1, 1)])

这种方法避免了循环,利用NumPy的向量化操作提升效率,适合处理大规模数组。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:25:00