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

Python多维数组匹配时使用math.isclose过滤接近值的实现问题

解决思路

原来的np.intersect1d是基于严格值相等做集合交集运算,不支持自定义匹配规则,因此需要替换为自定义的条件判断逻辑,具体修改如下:

注意:你需求中提到的rel_tol=0.5是相对公差参数,按你描述的「差值不超过0.5就判定为匹配」实际是绝对公差要求,对应math.isclose的abs_tol=0.5,如果使用rel_tol=0.5会出现相对误差50%以内都匹配的情况,不符合你给出的预期输出,因此代码中已调整为绝对公差规则。

修改后代码
import numpy as np 

a = np.array([[0,12],[1,40],[0,55],[1,23],[0,123.5],[1,4]])
b = np.array([[0,3],[1,10],[0,55],[1,34],[1,122],[0,123]])
c = np.array([[0,3],[1,10],[0,55],[1,34],[1,122],[0,121]])
d = np.array([[0,40],[1,55],[0,24],[0,123],[0,4]])
e = np.array([[1,40.2],[1,55]])

def comp(a, other):
    # 广播计算所有行对的匹配条件
    # 第一列严格相等
    col1_match = a[:, 0, None] == other[:, 0]
    # 第二列绝对差不超过0.5
    col2_match = np.isclose(a[:, 1, None], other[:, 1], atol=0.5, rtol=0)
    # 只要有任意一行other满足条件,当前a行就算匹配
    match_mask = (col1_match & col2_match).any(axis=1)
    # 取出匹配的a行并去重
    result = np.unique(a[match_mask], axis=0)
    if len(result) == 0:
        print("No difference")
    else:
        # 转换为整数输出,和你给出的预期格式一致
        print("\n", result.astype(int))

comp(a, b)
comp(a, c)
comp(a, d)
comp(a, e)
输出结果
[[  0  55]
 [  0 123]]

 [[ 0 55]]

 [[  0 123]]

 [[ 1 40]]

完全匹配你给出的预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:15:03