提取几乎相同的数组值

时间:2019-12-18 10:59:35

标签: python arrays numpy-ndarray

我有这个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]

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

2 个答案:

答案 0 :(得分:3)

这是一个简单的方法:

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

答案 1 :(得分:1)

OP要求分组对,而不是简单地打印对,因此John Zwink提出的解决方案是不完整的。为了获得完整的答案,我们的想法是将ndarrays转换为可哈希的等效项(例如tuple),并将所有它们合并为一个集合以避免重复。在这里:

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中获得与所需分组相同的分组