从 python list/array 中有效地提取前两个最大数字的索引,并可能出现平局

Efficiently extracting the indices of the first two largest numbers from a python list/array with possible tie-breaks

所以我有以下情况。我有一个包含 4 个成员的 python 列表:[A1,A2,B1,B2] 并且我有一个计算它们的值的函数和 returns 一个 Numpy 整数数组,例如[8,5,9,7]。我需要提取具有最高值的两个成员,其中类型 A 的成员比类型 B 的成员具有更高的重要性(在抢七的情况下)。换句话说,我需要数组中前两个最大值的索引。在上面的示例中,它将是 [0,2]。我需要这些索引 select 原始列表中的成员,在本例中为 A1B1.

value_array = [8,8,4,8]的情况下,函数应该return[0,1]。 这个问题很简单,很容易解决(我在这里也看到了同样的问题:),但我正在寻找计算效率最高的实现。因为我知道 python 很慢,所以我认为使用内置的 Numpy 函数是避免慢循环的方法。我使用 np.argmax(value_array) 但它只是 returns 第一个最大值的索引。我能做的是从数组中删除这个元素并再次调用相同的函数,但我不知道这是否是最快的方法,因为我然后调用和计算最大值两次以及从中删除元素值数组。

我的另一个想法是为成员创建一个 class 以赋予他们属性 typevalue。然后可以检查 属性 类型,但我觉得这只会使它变慢并且不必要地复杂化(我不知道 属性 检查在 Python 中有多快)。

有没有人有聪明的解决方案来获取 Numpy 整数数组中前两个最大数字的索引?

您可以使用 pandas 进行排序和切片

a = ['A1', 'A2', 'B1', 'B2']
b = [8, 5, 9, 2]
df = pd.DataFrame({"a": a, "b": b})
df.sort_values(['b', 'a'], ascending=False, inplace=True)
df.iloc[:2].index

您可以使用 np.argpartition 来查找数组中的第 k 个最小值(以及相应的第 (n-k) 个最大值)。结果值是无序的。如果你想让它们排序,那么你需要对最大值的结果数组进行排序。此解决方案比对整个数组排序快得多(排序在 O(n log n) 时间内运行,而分区在 O(n) 时间内完成)。

a = np.array(['A1', 'A2', 'B1', 'B2'])
b = np.array([8, 5, 9, 7])

biggest_b_pos = np.argpartition(b, len(b)-2)[-2:]
result = a[biggest_b_pos]