Выбор дублирующих точек в списке данных - PullRequest
4 голосов
/ 07 ноября 2011

Я пытаюсь отбросить некоторые элементы списка данных в 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 &]

делает трюк, ноИнтересно, почему я не могу работать со списком списков?

1 Ответ

4 голосов
/ 07 ноября 2011

Есть несколько способов приблизиться к этому. Один из способов сделать это, который я считаю наиболее подходящим, поскольку вы требуете, чтобы ваши элементы находились в определенных интервалах, - это использовать 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}}
...