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

如何按列值匹配条件合并两个二维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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:25:37