11
$\begingroup$

We can use Max[exampleList] or Min[exampleList] to find the maxima and minima of exampleList, however, is there a similar standalone function that returns something like {position in array, maximum value in the array} or {position in array, minimum value in the array}, i.e. both the position and value of the maximum or minimum element in exampleList? It seems awkward to have to write Position[exampleList,Max[exampleList]] or Position[exampleList,Min[exampleList]]?

$\endgroup$
16
$\begingroup$
Position[list,_?(#==Max[list]&)]

or shorter (per your comment...)

Position[list,Max[list]]

will do the trick, obviously change Max to Min for minimum...

Or, as suggested in comments

Ordering[list,1]
Ordering[list,-1]

Will give positions of minimum and maximum, respectively.

Computation times

order[n_] := Block[{},
  list = RandomReal[1, n];
  t1 = (Position[list, Min@list]; // RepeatedTiming // First);
  t2 = (Ordering[list, 1]; // RepeatedTiming // First);
  {{n, t1}, {n, t2}}]
tab = ParallelTable[order[Floor[1.1^n]], {n, 1, 100, 1}];
ListLogLogPlot[{tab[[All, 1]], tab[[All, 2]]}]

enter image description here

Ordering is much faster.

$\endgroup$
  • $\begingroup$ Why can't we just write Position[exampleList,Max[exampleList]]? Sorry, I wrote that just as you were posting this answer. $\endgroup$ – Geof Apr 9 '14 at 8:56
  • $\begingroup$ @Geof: Well, for one thing, that's incomplete. The first argument to Position is the target list, and Max does not return a list... $\endgroup$ – ciao Apr 9 '14 at 8:57
  • $\begingroup$ OK, I like the use of Ordering here, that's what I was after! $\endgroup$ – Geof Apr 9 '14 at 8:58
  • $\begingroup$ Sorry, that was a typo, I fixed the comment. I meant, why can't "(#==Max[list]&)" just be "Max[exampleList]"? $\endgroup$ – Geof Apr 9 '14 at 8:58
  • $\begingroup$ @geof: you can, I'm just in the habit of having complex functions there... $\endgroup$ – ciao Apr 9 '14 at 8:59

Not the answer you're looking for? Browse other questions tagged or ask your own question.