在数据列表中选择重复点

时间:2011-11-07 03:48:38

标签: select wolfram-mathematica union duplicate-removal

我正在尝试删除Mathematica中数据列表的一些元素,但我不明白SelectUnion的工作原理。例如,假设我有以下列表

list = {{0.10,0.20},{1.10,0.20},{0.70,0.80},{0.20,1.10},
    {1.20,1.20},{0.12,0.18},{0.68,0.76}}

并且只希望(0,1)x(0,1)中的元素考虑距离半径0.05内的点是重复的。在示例中,

list1 ={{0.10,0.20},{0.70,0.80}}  

我不在乎元素代表等价类。我正在做以下事情:

list1 = Select[list, 0 < Part[#,1] <1 &];Select[list,0 < Part[#,2] <1 &]

给出(0,1)x(0,1)中的分数,但如果我尝试使用Union,例如

Union[list1, SameTest -> (Abs[#1-#2] < 0.05 &)]

我收到了插槽错误。

有人可以向我解释如何巧妙地做到这一点吗?

--- --- EDIT

使用

DeleteDuplicates[list1, Abs[Part[#1, 1] - Part[#2, 1]] < 10^-6 &]

诀窍,但我想知道为什么我不能使用列表列表。

1 个答案:

答案 0 :(得分:4)

有几种方法可以解决这个问题。一种方法,我认为是最好的,因为你需要你的元素在一定的时间间隔内,是IntervalMemberQSelect一起使用。

例如,要将您的列表缩小到(0,1)x(0,1)中的那些点:

list01 = Select[list, And @@ IntervalMemberQ[Interval[{0, 1}], #] &]

Out[1]= {{0.1, 0.2}, {0.7, 0.8}, {0.12, 0.18}, {0.68, 0.76}}

其次,要消除重复,请使用DeleteDuplicates,这是完成此任务的完美工具。您可以使用IntervalMemberQ

使用相同的测试
DeleteDuplicates[list01, 
 And @@ IntervalMemberQ[Interval[{0, 0.5}], Abs[#1 - #2]] &]

Out[2]= {{0.1, 0.2}, {0.7, 0.8}}