[Numpy-discussion] Find indices of largest elements

Keith Goodman kwgoodman at gmail.com
Wed Apr 14 12:01:02 EDT 2010


On Wed, Apr 14, 2010 at 8:49 AM, Keith Goodman <kwgoodman at gmail.com> wrote:
> On Wed, Apr 14, 2010 at 8:16 AM, Nikolaus Rath <Nikolaus at 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:
>
>>> shape = (3,2)
>>> x = np.random.rand(*shape)
>>> x
> array([[ 0.83424288,  0.17821326],
>       [ 0.62718311,  0.63514286],
>       [ 0.18373934,  0.90634162]])
>>> r = x.reshape(-1).argsort().argsort().reshape(shape)
>>> r
> array([[4, 0],
>       [2, 3],
>       [1, 5]])
>
> To find the indices you can use where:
>
>>> r < 2
> array([[False,  True],
>       [False, False],
>       [ True, False]], dtype=bool)
>>> np.where(r < 2)
>   (array([0, 2]), array([1, 0]))
>
> ...but the indices will not be in order.

...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()
>> np.unravel_index(r[0], shape)
   (0, 1)
>> np.unravel_index(r[1], shape)
   (0, 0)
>> np.unravel_index(r[2], shape)
   (2, 1)
>> np.unravel_index(r[-1], shape)
   (1, 0)



More information about the NumPy-Discussion mailing list