MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

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




  • Prev by Date: Re: Conjugate of symbolic expressions
  • Next by Date: Re: find index in an array
  • Previous by thread: Re: find index in an array
  • Next by thread: Re: find index in an array