0

我有一个两列数组,它已经根据第一列排序。我想根据我的规则删除一些元素:

1)将元素的值与第一列中的所有其他值进行比较。如果值与其他值的差异大于给定值(例如 0.1),则将其保留在新数组中。否则,如果与其他数据的差异小于该值的数据,则所有这些值都可以视为一个比较组,则

2)对于这些比较组,我需要比较它们在第二列中的元素,并仅保留组中第二列中具有最小值的元素。

例如:如果我的数组是

 a= [[1.2, 3], 
     [2.2, 3], 
     [2.25, 1], 
     [2.28, 3], 
     [3.2, 8], 
     [4.2, 10]]

然后我想要得到的是:

  a=[[1.2, 3],  
     [2.25, 1], 
     [3.2, 8], 
     [4.2, 10]]

我删除了第二个和第四个元素。因为第一个元素 2.2、2.25 和 2.28 的差值小于 0.1,但第二个元素 1 是其中最小的一个。

有人能给我一些提示吗?谢谢

4

1 回答 1

0
from numpy import *

eps = 0.1
#ASSUMING the second arrow is sorted (otherwise sort it first)
a= array(
    [[1, 1.2, 3],     
    [2, 2.2, 3], 
    [3, 2.25, 1], 
    [4, 2.28, 4],
    [5, 3.2, 8], 
    [6, 4.2, 10],
    [7, 4.21, 3], 
    [8, 4.25, 4], 
    [9, 4.28, 1],
    [10, 5.2, 10],
    ])
# expected result
# a= [[1, 1.2, 3],
#     [3, 2.25, 1],
#     [5, 3.2, 8],
#     [9, 4.28, 1],
#     [10, 5.2, 10],
#     ]

n = shape(a)[0]
b = a[:,1]

a1 = a[ (diff(b)<eps) ]
#indexes of some False that could be True.
#these indexes should be checked backwards
#and evtl. added to a1
indexes = where((diff(b)<eps)==False)[0][1:]
for index in indexes:
    if b[index] - b[index-1]<eps:
        a1 = vstack( (a1,a[index,:]) )

#sort array
a1 = a1[lexsort( (a1[:,1],a1[:,1]))]

groups = where(diff(a1[:,1])>eps)[0]
i = 0
# get min of groups
for g in groups:
    ag = a1[i:g+1,2]
    Ag = a1[i:g+1,:]
    if i == 0:
        a2 = Ag [ ag == min(ag) ]
    else:
        a2 = vstack( (a2, Ag [ ag == min(ag) ] ) )

    i = g+1
#add last group
ag = a1[g+1:,2]
Ag = a1[g+1:,:]    
a2 = vstack( (a2, Ag [ ag == min(ag) ]) )

#the elements that build no groups
result = a[ in1d(a[:,0], [ int(i) for i in a[:,0] if i not in a1[:,0] ])  ] 
# add the elements of a2, these are the minimal elements of each group
result = vstack( (result, a2) )
# sort the result (optional)
result = result[lexsort( (result[:,0], result[:,0]))]
print "final result\n", result

这是此代码的输出

In [1]: run filter.py
final result
[[  1.     1.2    3.  ]
 [  3.     2.25   1.  ]
 [  5.     3.2    8.  ]
 [  9.     4.28   1.  ]
 [ 10.     5.2   10.  ]]
于 2013-10-31T13:37:04.110 回答