【问题标题】:NumPy setdiff1d with tolerance - Comparing a numpy array to another and saving only the unique values - outside of a tolerance具有容差的 NumPy setdiff1d - 将 numpy 数组与另一个数组进行比较并仅保存唯一值 - 在容差之外
【发布时间】:2019-01-15 14:18:54
【问题描述】:

我有两个 numpy 数组:

A= [ 3.8357  3.2450]

B= [ 5.6132  3.2415  3.6086  3.5666  3.8769  4.3587]

我想将 A 与 B 进行比较,并且只保留 A 中唯一的值 - 超出 +/-0.04 容差(即 A=[3.8357])。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: python arrays python-3.x numpy


    【解决方案1】:

    方法#1

    我们可以使用broadcasting -

    A[(np.abs(np.subtract.outer(A,B)) > 0.04).all(1)]
    

    方法 #2

    我们可以利用searchsorted 来拥有一个带有公差说明符的通用numpy.isin,以用于通用问题,就像这样 -

    def isin_tolerance(A, B, tol):
        A = np.asarray(A)
        B = np.asarray(B)
    
        Bs = np.sort(B) # skip if already sorted
        idx = np.searchsorted(Bs, A)
    
        linvalid_mask = idx==len(B)
        idx[linvalid_mask] = len(B)-1
        lval = Bs[idx] - A
        lval[linvalid_mask] *=-1
    
        rinvalid_mask = idx==0
        idx1 = idx-1
        idx1[rinvalid_mask] = 0
        rval = A - Bs[idx1]
        rval[rinvalid_mask] *=-1
        return np.minimum(lval, rval) <= tol
    

    因此,解决我们的问题 -

    out = A[~isin_tolerance(A, B, tol=0.04)]
    

    示例运行 -

    In [294]: A
    Out[294]: array([13.8357,  3.245 ,  3.8357])
    
    In [295]: B
    Out[295]: array([5.6132, 3.2415, 3.6086, 3.5666, 3.8769, 4.3587])
    
    In [296]: A[~isin_tolerance(A, B, tol=0.04)]
    Out[296]: array([13.8357,  3.8357])
    

    【讨论】:

    • 第二种方法效果很好,非常感谢^^!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多