Keith Goodman <kwgood...@gmail.com> writes: > On Wed, Apr 14, 2010 at 12:39 PM, Nikolaus Rath <nikol...@rath.org> wrote: >> Keith Goodman <kwgood...@gmail.com> writes: >>> On Wed, Apr 14, 2010 at 8:49 AM, Keith Goodman <kwgood...@gmail.com> wrote: >>>> On Wed, Apr 14, 2010 at 8:16 AM, Nikolaus Rath <nikol...@rath.org> wrote: >>>>> Hello, >>>>> >>>>> How do I best find out the indices of the largest x elements in an >>>>> array? >>>>> >>>>> Example: >>>>> >>>>> a = [ [1,8,2], [2,1,3] ] >>>>> magic_function(a, 2) == [ (0,1), (1,2) ] >>>>> >>>>> Since the largest 2 elements are at positions (0,1) and (1,2). >>>> >>>> Here's a quick way to rank the data if there are no ties and no NaNs: >>> >>> ...or if you need the indices in order: >>> >>>>> shape = (3,2) >>>>> x = np.random.rand(*shape) >>>>> x >>> array([[ 0.52420123, 0.43231286], >>> [ 0.97995333, 0.87416228], >>> [ 0.71604075, 0.66018382]]) >>>>> r = x.reshape(-1).argsort().argsort() >> >> I don't understand why this works. Why do you call argsort() twice? >> Doesn't that give you the indices of the sorted indices? > > It is confusing. Let's look at an example: > >>> x = np.random.rand(4) >>> x > array([ 0.37412289, 0.68248559, 0.12935131, 0.42510212]) > > If we call argsort once we get the index that will sort x: > >>> idx = x.argsort() >>> idx > array([2, 0, 3, 1]) >>> x[idx] > array([ 0.12935131, 0.37412289, 0.42510212, 0.68248559]) > > Notice that the first element of idx is 2. That's because element x[2] > is the min of x. But that's not what we want.
I think that's exactly what I want, the index of the smallest element. It also seems to work: In [3]: x = np.random.rand(3,3) In [4]: x Out[4]: array([[ 0.49064281, 0.54989584, 0.05319183], [ 0.50510206, 0.39683101, 0.22801874], [ 0.04595144, 0.3329171 , 0.61156205]]) In [5]: idx = x.reshape(-1).argsort() In [6]: [ np.unravel_index(i, x.shape) for i in idx[-3:] ] Out[6]: [(1, 0), (0, 1), (2, 2)] So why the additional complication with the second argsort? I just don't get it... > We want the first > element to be the rank of the first element of x. I'm not quite sure why we want that...? Best, -Nikolaus -- »Time flies like an arrow, fruit flies like a Banana.« PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion