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

