Select 在数据列表上选择重复点

Select 在数据列表上选择重复点,select,duplicates,union,wolfram-mathematica,Select,Duplicates,Union,Wolfram Mathematica,我试图删除Mathematica中数据列表中的一些元素,但我不明白Select和Union是如何工作的。例如,假设我有以下列表 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,1x0,1中的元素,考虑到距离半径为0.05的点是重复的。在这个例子中 list1 ={{0.10,0.20},{0.70,0.80}} 我不在乎哪个元素

我试图删除Mathematica中数据列表中的一些元素,但我不明白Select和Union是如何工作的。例如,假设我有以下列表

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,1x0,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 &]
我得到插槽错误

有人能给我解释一下怎么干净利落地做吗

--编辑--

使用


这很有技巧,但我想知道为什么我不能使用列表列表。

有几种方法可以实现这一点。一种方法,我认为是最整洁的,因为你需要你的元素在一定的时间间隔内,就是使用IntervalMemberQ和Select

例如,要将列表缩小到0,1x0,1中的点,请执行以下操作:

其次,要消除重复项,请使用DeleteDuplicates,这是完成此任务的最佳工具。您可以使用IntervalMemberQ使用相同的测试:


非常感谢你。这就解决了问题。我不明白的是为什么在这种情况下没有插槽错误,这就是我使用Part的原因。@Manuel DeleteDuplicates检查所有元素对,这里的每个元素都是list01的子列表。插槽1指的是一对中的第一个,插槽2指的是第二个。我喜欢它。但有时是欺骗。例如,尝试list01=Union[Tuples[{1,0},2],{{1/2,1/2}]。它返回{0,0},但是{1,1}超出了它的等价范围。@belisarius我明白你的意思,但是根据我对问题的理解,{1,1}应该在结果中。如果你有{0,0},{1/2,1/2},{1,1},根据OP,无论是{0,0},{1,1}还是{1/2,1/2}都是可以接受的答案。还是我读错了?{0,0},{1,1}}和{1/2,1/2}都是可以接受的,因为我不关心等价类的代表,因为我使用的等价间隔非常小,但在抽象的情况下,这个问题应该得到解决。请允许我欢迎您来到StackOverflow,并提醒我们在这里通常会做的三件事:1当您收到帮助时,尝试给予帮助,回答您专业领域的问题2 3当您看到好的问答时,请通过,因为系统的可信度是基于用户通过分享知识而获得的声誉。还记得接受更好地解决问题的答案,如果有的话,
Union[list1, SameTest -> (Abs[#1-#2] < 0.05 &)]
DeleteDuplicates[list1, Abs[Part[#1, 1] - Part[#2, 1]] < 10^-6 &]
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[list01, 
 And @@ IntervalMemberQ[Interval[{0, 0.5}], Abs[#1 - #2]] &]

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