RE: For Routine to Map Routine
- To: mathgroup at smc.vnet.net
- Subject: [mg70445] RE: [mg70400] For Routine to Map Routine
- From: "David Annetts" <davidannetts at aapt.net.au>
- Date: Mon, 16 Oct 2006 02:36:00 -0400 (EDT)
Hi Benedetto, > Dimensions of ans01 is 2185850 by 5. > I am looking to convert my For routine to the more efficient > Map routine > > n=Length[ans01] > fo={}; > > For[i=1, i<n, i++, > If[ans01[[i,1]] == ans01[[i+1,1]], > AppendTo[fo, ans01[[1]]]]; > > I tried > Map[If[#[[1]] == #[[1]],#]&,ans01]; You are attempting to find all elements in a list such that the first element in successive list elements is identical. From this sublist, you want only the first entry. Given that I want to test with 100 elements rather than 2185850, TableForm[ans = Array[Random[Integer, {0, 10}] &, {100, 5}]]; Dimensions@ans We can isolate the first element from each list using tst = ans[[All, 1]] If successive elements are identical, then differences between them will be zero Position[tst - RotateLeft@tst, 0] Documentation for Part[] shows that we can use its output to take specific elements from an array. In conjunction with the last step we have ans[[#]] & /@ Position[tst - RotateLeft@tst, 0] This has an extra level of nesting that we can remove by mapping Flatten. Again, in conjunction with the last step ... Map[Flatten, ans[[#]] & /@ Position[tst - RotateLeft@tst, 0], 1] You want only the first part of this array. Putting it all together, we have tst = ans[[All, 1]]; tmp = Map[Flatten, ans[[#]] & /@ Position[tst - RotateLeft@tst, 0], 1][[All, 1]] If you're _really_ not interested in the other elements of arrays, then Flatten[ans[[All, 1]][[#]] & /@ Position[ans[[All, 1]] - RotateLeft@ans[[All, 1]], 0]] Gives the same result. Regards, Dave. -- No virus found in this outgoing message. Checked by AVG Free Edition. Version: 7.1.408 / Virus Database: 268.13.4/476 - Release Date: 14/10/2006