让我们说有一个如下所示的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)
答案 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])