如何以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
相关产品推荐
相关产品推荐

