【问题标题】:How to find the indices of the i-th largest element of an n-dimensional numpy array?如何找到 n 维 numpy 数组的第 i 个最大元素的索引?
【发布时间】:2019-05-31 11:27:02
【问题描述】:

我知道如何找到 n 维数组的最大元素的索引。

我们举个例子:

a=np.asarray([[1,7,-4],[9,-11,-17]])

然后(source):

from numpy import unravel_index
unravel_index(a.argmax(), a.shape)

返回:

(1, 0)

确实a[1,0]9,这是数组a 中的最高元素,所以我们很好。


我还能够弄清楚如何找到一维 numpy 数组 (using) 的第 i 个最大元素的索引:

a = np.array([1, 3, 2, 4, 5])

i=3 # we want the third largest element, for example
a.argsort()[-i]

这会返回1,这很好,因为a[1]=3 确实是a 的第三大元素。


我想将这两者结合起来。所以如果我有

a=np.asarray([[1,7,-4],[9,-11,-17]])

我想要一个输出告诉我数组a 的第i 个最大元素的索引,例如如果i=3,输出应该是[0,0],因为a[0,0]=1 是第i 个(第三个) a 的最大元素。

我该怎么做?

【问题讨论】:

  • stackoverflow.com/a/9483964/10708112 可能会有所帮助。
  • 是的,问题是我并不总是想要最大值(即第一个最大的),而是第 i 个最大的,而我无法使用 a.argmax()。

标签: python arrays python-3.x numpy max


【解决方案1】:

那么要得到某个最大的索引或者哪个,你可以使用where:

通过webDev添加到上述答案:

import numpy as np
i=2

a=np.asarray([[1,7,-4],[9,-11,-17]])

flat=a.flatten()
flat.sort()
tryvalue= flat[-i]

i, j = np.where(a == tryvalue)
print(i,j)

这会给你:

[0] [1]

我的意思是您可以自行更改您希望这些索引的样子(元组或其他)。

【讨论】:

  • 是的np.where()@Amit
【解决方案2】:

这是一种简单的方法。

import numpy as np
i=3
a=np.asarray([[1,7,-4],[9,-11,-17]])
flat=a.flatten()
flat.sort()
print(flat)
print(flat[-i])
i, j = np.where(a == flat[-i])
print(i,j)

您可以将其展平然后排序。它将根据您的第 i 个最大输出,即i=3,为您提供所需的输出。如果你输入 i=5,flat[-i] 会给你-11

【讨论】:

  • 这会给我 1,但我如何得到 [0,0]?
  • 是的,如果 i=5,它确实给了我 -11。在这种情况下,我想要 [1,1],因为 a[1,1]=-11 是数组的第 5 大元素。
  • 确实有效。谢谢!
【解决方案3】:

您还可以在展平数组上使用 heapq.nlargest 并获取那些最大的 i 元素中的最小值。在大多数情况下,这应该比排序更有效:

import numpy as np
import heapq

a = np.asarray([[1, 7, -4], [9, -11, -17]])
i = 2

ith_largest = min(heapq.nlargest(i, a.flatten()))
x, y = np.where(a == ith_largest)
print(x, y)  # [0] [1]

【讨论】:

    【解决方案4】:

    Amit Amolaanswer 非常好。如果有人需要另一个,我找到了这个解决方案:

    a=np.asarray([[1,7,-4],[9,-11,-17]])
    flat=a.flatten()
    flat.sort()
    i=5
    
    for k, p in enumerate(a):
        for j, q in enumerate(p):
            if q == flat[-i]:
                indices=[k,j]
    
    print(indices)
    

    [1, 1],很好。

    【讨论】:

    • Enumerate 跟踪索引,但是 zabop,这里的问题是嵌套循环。我的意思是,如果这是在处理要找到的多个值,比如说要找到它们的 10 万个这样的数组的索引的最大值,那么嵌套循环只会完全搞砸复杂性。因此,如果处理更大的数据,请务必注意这个问题。
    • 是的,好点,这只适用于低维度的小数组。
    猜你喜欢
    • 2015-06-02
    • 2011-03-08
    • 2020-09-06
    • 2018-09-01
    • 1970-01-01
    • 2019-07-14
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多