Re: Delete close, but not identical elements in an array
- To: mathgroup at smc.vnet.net
- Subject: [mg123370] Re: Delete close, but not identical elements in an array
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com>
- Date: Sun, 4 Dec 2011 02:51:12 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jbcsev$bvn$1@smc.vnet.net>
On Sat, 03 Dec 2011 10:08:31 -0000, Peter Rodenbach <peter.rodenbach at googlemail.com> wrote: > Hi, > > I have the problem that I have to indentify peaks in an 2D array. I > can do this by Ordering[] the entries in the Flatten[] list. Then I > indentify the positions of the peaks in the array and write them into > a list. An example I work on in an 512 x 512 Pixel array: > > Peaks={{229,170},{119,265},{331,202},{118,264},{314,245}} > > As you can see from those 5 peaks, Number 2 and 4 belong to the same > peak. As I have to count the data at that positions and compare them, > I have to get rid of the peak postions that neighbor each other, as > they actually belong to the same peak. > > What I want now is: have Mathem. evaluate the positions in the list > and delete those which are +-10 pixels around any other. > So the list would look like Peaks={{229,170},{119,265},{331,202}, > {314,245}} afterwards. > > Thanks for the help!! > I guess I would suggest something along these lines (with a couple of extra duplicates added to your example for expository purposes): In[1] := pks = { {229, 170}, {119, 265}, {331, 202}, {118, 264}, {314, 245}, {331, 203}, {113, 268} }; In[2] := (* Define our distance metric *) nf = Nearest[ pks, DistanceFunction -> (Boole[EuclideanDistance[##] > 10] &) ] Out[2] = NearestFunction[{7,2}, <>] In[3] := (* Gather duplicates by peak *) dups = Rest /@ DeleteDuplicates@Select[nf /@ pks, Length[#] > 1 &] Out[3] = {{{118, 264}, {113, 268}}, {{331, 203}}} In[4] := (* Remove duplicates *) DeleteCases[pks, Alternatives @@ Flatten[dups, 1]] Out[4] = {{229, 170}, {119, 265}, {331, 202}, {314, 245}}