在numpy数组中按值获取前k个数字的索引?

时间:2014-11-24 03:36:39

标签: python arrays numpy

让我们说有一个如下所示的numpy数组:

import numpy as np
a = array([[1,2,3],[4,3,1]]) 

你想要返回前三个数字。您可以通过以下方式找到最大值:

i,j = np.unravel_index(a.argmax(), a.shape)

但是对于第二和第三顶值的指数,你怎么能找到它们?我能想到的唯一选择是为存储在最大索引处的值设置0,然后再次运行该过程。必须有更好的方法吗?

以下答案为:(1,0),(0,2),(1,1)

2 个答案:

答案 0 :(得分:2)

如果将axis=None参数传递给argsort,它将返回展平数组的已排序索引(按升序排列)。 numpy.unravel_index函数将展平数组的索引转换为给定形状的数组的索引。

>> a = np.array([[1,2,3],[4,3,1]])
>> np.unravel_index(a.argsort(axis=None), dims=a.shape)
   (array([0, 1, 0, 0, 1, 1], dtype=int64),
    array([0, 2, 1, 2, 1, 0], dtype=int64))

unravel_index的结果是一个数组元组,其中每个数组都是沿各个轴的索引。要将索引配对成坐标,我们可以使用zip

>> ix = np.unravel_index(a.argsort(axis=None), dims=a.shape)
>> zip(*ix)[-3:]
   [(0, 2), (1, 1), (1, 0)]

这又是按升序排列的。我们可以使用负步幅来降序。

>> zip(*ix)[:2:-1]
   [(1, 0), (1, 1), (0, 2)]

这是整行在一行,其中n是" top"你想要的坐标。

>> zip(*np.unravel_index(a.argsort(axis=None), dims=a.shape))[::-1][:n]

答案 1 :(得分:0)

您需要首先展开数组,然后对其进行排序并使用unique拒绝重复输入。

>>> a.flatten()
array([1, 2, 3, 4, 3, 1])
>>> b=a.flatten()
>>> np.unique(np.sort(b))[-3:]
array([2, 3, 4])

并获取索引,您可以使用argsort

>>> b.argsort()[-3:]
array([2, 4, 3])