我正在尝试删除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,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 &]
诀窍,但我想知道为什么我不能使用列表列表。
答案 0 :(得分:4)
有几种方法可以解决这个问题。一种方法,我认为是最好的,因为你需要你的元素在一定的时间间隔内,是IntervalMemberQ
与Select
一起使用。
例如,要将您的列表缩小到(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}}