如何按列值匹配条件合并两个二维NumPy数组
按条件合并两个NumPy数组的实现方案
问题说明
给定两个二维NumPy数组A和B,需实现:当A的前两列与B的前两列完全匹配时,将B对应行的最后一列值追加到A的该行末尾;若不匹配则追加0,最终得到数组C。
注意:原输入的B数组第一行第二列存在笔误(
201),与A第三行的201.657无法匹配,因此修正为201.657以得到期望结果。
方法一:纯NumPy实现
通过结构化数组实现行级匹配,步骤清晰,无需额外依赖:
import numpy as np # 初始化数组 A = np.array([ [100.121,200.129,1,2,3], [105.343,203.347,2,2,1], [107.426,201.657,1,3,1], [100.121,300.010,1,1,1] ]) B = np.array([ [107.426,201.657,675,80], [100.121,200.129,70], [100.121,300.010,90] ]) # 提取B的匹配键(前两列)和目标值(最后一列) b_keys = B[:, :2] b_values = B[:, -1] # 初始化结果列,默认填充0 result_col = np.zeros(A.shape[0]) # 将二维数组的前两列转换为结构化数组,实现行级匹配 a_struct = A[:, :2].view('f8,f8') b_struct = b_keys.view('f8,f8') # 遍历所有匹配的行,赋值对应的值 for idx, a_row in enumerate(a_struct): match_idx = np.where(b_struct == a_row)[0] if len(match_idx) > 0: result_col[idx] = b_values[match_idx[0]] # 合并原数组A和结果列,得到最终数组C C = np.hstack((A, result_col.reshape(-1, 1))) print(C)
输出结果:
[[100.121 200.129 1. 2. 3. 70. ] [105.343 203.347 2. 2. 1. 0. ] [107.426 201.657 1. 3. 1. 80. ] [100.121 300.01 1. 1. 1. 90. ]]
方法二:使用Pandas简化实现
Pandas的merge方法天然适合这类匹配合并场景,代码更简洁:
import numpy as np import pandas as pd # 初始化数组 A = np.array([ [100.121,200.129,1,2,3], [105.343,203.347,2,2,1], [107.426,201.657,1,3,1], [100.121,300.010,1,1,1] ]) B = np.array([ [107.426,201.657,675,80], [100.121,200.129,70], [100.121,300.010,90] ]) # 转换为DataFrame,指定列名方便匹配 df_A = pd.DataFrame(A, columns=['x', 'y', 'col1', 'col2', 'col3']) df_B = pd.DataFrame({ 'x': B[:, 0], 'y': B[:, 1], 'val': B[:, -1] }) # 左连接匹配x和y列,不匹配的填充0 merged_df = df_A.merge(df_B, on=['x', 'y'], how='left').fillna(0) # 转换回NumPy数组 C = merged_df.values print(C)
输出结果与方法一完全一致。
内容的提问来源于stack exchange,提问作者Sbobby
相关产品推荐
相关产品推荐

