Re: find index in an array
- To: mathgroup at smc.vnet.net
- Subject: [mg108160] Re: find index in an array
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Tue, 9 Mar 2010 06:25:35 -0500 (EST)
On 3/8/10 at 6:15 AM, dflatin at rcn.com (Daniel Flatin) 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}}}; >indx == findIndex[a, 0.3 < # < 0.7&] >output: >{{1, 2, 2}, {2, 1, 1}, {2, 1, 2}} >If any readers has some insight into a more compact, elegant, or >Mathematica-like approach to this findIndex function, please feel >free to respond. Elegance is somewhat subjective. But here is another approach. In[21]:= Most[ArrayRules[SparseArray[Clip[a, {.3, .7}, {0, 0}]]]] /. HoldPattern[a_ -> _] :> a Out[21]= {{1, 2, 2}, {2, 1, 1}, {2, 1, 2}} This could be made more general by replacing Clip with a function that makes the elements you aren't interested in 0. That function would then applied to each element using Map.