Re: find index in an array
- To: mathgroup at smc.vnet.net
- Subject: [mg108163] Re: [mg108104] find index in an array
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Tue, 9 Mar 2010 06:26:08 -0500 (EST)
- Reply-to: hanlonr at cox.net
Position is much more straightforward. a = {{{0.08896779137, 0.08522648397}, {0.1162297255, 0.4316697935}}, {{0.6409512512, 0.3506400003}, {0.1156346501, 0.9537010025}}, {{0.8820963106, 0.9962655552}, {0.004333293427, 0.727745896}}}; Position[a, _?(0.3 < # < 0.7 &)] {{1, 2, 2}, {2, 1, 1}, {2, 1, 2}} Position[a, _?(# > 0.7 &)] {{2, 2, 2}, {3, 1, 1}, {3, 1, 2}, {3, 2, 2}} Bob Hanlon ---- Daniel Flatin <dflatin at rcn.com> wrote: ============= I work in an environment where another system is the dominant analysis tool. In porting some code to my preferred work environment, Mathematica, I find that I occasionally need to reinvent functionality found in the other system. One such function is find(). In that system, this function returns all the non-zero indices in an array. Usually, this test array is the consequence of a logical operation on each element, so that in the that system indx == find(A > 3); returns all the indices for which elements of A are greater than 3. I have replicated this functionality in Mathematica, and I wanted to both share it, and maybe get some input in how I could make it more efficient or more elegant. One of the ways I learn to program in Mathematica is to analyze all the various responses to simple questions here, and I am hoping to steer the process here. Here is my function: findIndex[ array_?ArrayQ, test_ ] :== Module[ {n==Length[Dimensions[array]],idx}, idx == Cases[MapIndexed[If[test[#1],#2]&,array,{n}],{__Integer},n]; If[n====1,Flatten[idx],idx] ] example: (* set a *) a == {{{0.08896779137,0.08522648397},{0.1162297255,0.4316697935}},{{0.6409512512,0.3506400003},{0.1156346501,0.9537010025}},{{0.8820963106,0.9962655552},{0.004333293427,0.727745896}}}; (* get indices *) indx == findIndex[a, 0.3 < # < 0.7&] output: {{1, 2, 2}, {2, 1, 1}, {2, 1, 2}} and to verify this is a valid result: Extract[a,indx] returns {0.4316697935,0.6409512512,0.3506400003} as does Select[Flatten[a], 0.3 < # < 0.7&] Note that this function is quite a bit like Position[] except that it works on results of a logical comparison rather than a pattern. Position, on the other hand, has some a feature I view as a virtue. It can operate on non-array objects, in fact, it can operate on non-list objects. If any readers has some insight into a more compact, elegant, or Mathematica-like approach to this findIndex function, please feel free to respond. Anyway, thanks for your time, and in advance for your thoughts. Dan