获取ndarray中N个最高值的索引

时间:2014-10-28 08:29:04

标签: python numpy indexing multidimensional-array

考虑到形状100x100x100的直方图,我想找到2个最高值a和b,以及它们的指数(a1,a2,a3)和(b1,b2,b3),例如:

hist[a1][a2][a3] = a
hist[b1][b2][b3] = b

我们可以使用hist.max()轻松获得最高值,但是如何在ndarray中获得X最高值?

据我所知,通常使用np.argmax来检索值索引,但在这种情况下:

hist.argmax().shape = ()  # single value
for i in range(3):
    hist.argmax(i).shape = (100, 100)

如何获得形状(3),每个维度具有一个值的元组?

3 个答案:

答案 0 :(得分:11)

您可以首先在展平版本的数组上使用numpy.argpartition来获取顶级k项的索引,然后您可以使用{{按照数组的形状转换这些1D索引3}}:

>>> arr = np.arange(100*100*100).reshape(100, 100, 100)
>>> np.random.shuffle(arr)
>>> indices =  np.argpartition(arr.flatten(), -2)[-2:]
>>> np.vstack(np.unravel_index(indices, arr.shape)).T
array([[97, 99, 98],
       [97, 99, 99]])
)
>>> arr[97][99][98]
999998
>>> arr[97][99][99]
999999

答案 1 :(得分:2)

您可以使用where

a=np.random.random((100,100,100))
np.where(a==a.max())
(array([46]), array([62]), array([61]))

进入一个阵列:

np.hstack(np.where(a==a.max()))
array([46, 62, 61])

并且,当OP要求元组时:

tuple(np.hstack(np.where(a==a.max())))
(46, 62, 61)

编辑:

要获取N最大集合的索引,您可以使用heapq模块中的nlargest函数:

N=3
np.where(a>=heapq.nlargest(3,a.flatten())[-1])
(array([46, 62, 61]), array([95, 85, 97]), array([70, 35,  2]))

答案 2 :(得分:0)

我想你可以这样做:

(伪代码)

#work on a copy
working_hist = copy(hist)
greatest = []

min_value = hist.argmin().shape

#while searching for the N greatest values, do N times
for i in range(N):
    #get the current max value
    max_value = hist.argmax().shape
    #save it
    greatest.append(max_value)
    #and then replace it by the minimum value
    hist(max_value.shape)= min_value

我多年没有使用过numpy,所以我不确定语法。代码就在这里,以便为您提供类似答案的伪代码。

如果您还保留了您提取的值的位置,则可以通过使用提取的信息在末尾恢复矩阵来避免处理项目的副本。