我有这个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]
有没有办法做到这一点? 最好
答案 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中获得与所需分组相同的分组