【问题标题】:Extract array values that are nearly identical提取几乎相同的数组值
【发布时间】:2019-12-18 10:59:35
【问题描述】:

我有这个 numpy 数组:

a = np.array([[8.04,9], [2.02,3], [8,10], [2,3], [8.12,18], [8.04,18],[2,8],[11,14]])

我想从这个数组中找到几乎相同的行值(第一个索引不超过 0.05,第二个索引不超过 1)并创建新的子数组。

对于这个例子,这将给出 6 个不同的数组(可能是大数组的一部分)。

a1 = [[8.04,9],[8,10]]
a2 = [[2.02,3],[2,3]]
a3 = [8.12,18]
a4 = [8.04,18]
a5 = [2,8]
a6 = [11,14]

有没有办法做到这一点? 最好的

【问题讨论】:

    标签: python arrays numpy-ndarray


    【解决方案1】:

    这里有一个简单的方法:

    for pair in a:
        cond1 = np.isclose(a[:,0], pair[0], atol=0.05)
        cond2 = np.isclose(a[:,1], pair[1], atol=1)
        print(a[cond1 & cond2])
    

    使用重复数据删除:

    done = np.zeros(len(a), bool)
    for ii, pair in enumerate(a):
        if done[ii]:
            continue
        cond = np.isclose(a[:,0], pair[0], atol=0.05)
        cond &= np.isclose(a[:,1], pair[1], atol=1)
        print(a[cond])
        done |= cond
    

    【讨论】:

    • 这会复制包含多个元素的打印列表
    • @CDJB:确实。我现在添加了具有重复数据删除功能的版本。
    【解决方案2】:

    OP 要求对对进行分组,而不仅仅是打印对,因此 John Zwink 提出的解决方案是不完整的。为了获得完整的答案,我们的想法是将 ndarrays 转换为可散列的等价物(例如元组)并将它们组合成一个集合以避免重复。这里:

    import numpy as np
    
    a = np.array([[8.04,9], [2.02,3], [8,10], [2,3], [8.12,18], [8.04,18],[2,8],[11,14]])
    
    groups = set()
    for pair in a:
        cond1 = np.isclose(a[:,0], pair[0], atol=0.05)
        cond2 = np.isclose(a[:,1], pair[1], atol=1.000000001)
        groups.add(tuple(map(tuple, a[cond1 & cond2])))
    
    print(groups)
    

    结果:

    {((8.12, 18.0),),
     ((8.04, 18.0),),
     ((2.02, 3.0), (2.0, 3.0)),
     ((11.0, 14.0),),
     ((8.04, 9.0), (8.0, 10.0)),
     ((2.0, 8.0),)}
    

    注意:我在第二个条件中添加了一个任意的 epsilon,以获得与 OP 中想要的相同的分组

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多