从 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 原始列表中的成员,在本例中为 A1
和 B1
.
在value_array = [8,8,4,8]
的情况下,函数应该return[0,1]
。
这个问题很简单,很容易解决(我在这里也看到了同样的问题:),但我正在寻找计算效率最高的实现。因为我知道 python 很慢,所以我认为使用内置的 Numpy 函数是避免慢循环的方法。我使用 np.argmax(value_array)
但它只是 returns 第一个最大值的索引。我能做的是从数组中删除这个元素并再次调用相同的函数,但我不知道这是否是最快的方法,因为我然后调用和计算最大值两次以及从中删除元素值数组。
我的另一个想法是为成员创建一个 class 以赋予他们属性 type
和 value
。然后可以检查 属性 类型,但我觉得这只会使它变慢并且不必要地复杂化(我不知道 属性 检查在 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]
所以我有以下情况。我有一个包含 4 个成员的 python 列表:[A1,A2,B1,B2]
并且我有一个计算它们的值的函数和 returns 一个 Numpy 整数数组,例如[8,5,9,7]
。我需要提取具有最高值的两个成员,其中类型 A 的成员比类型 B 的成员具有更高的重要性(在抢七的情况下)。换句话说,我需要数组中前两个最大值的索引。在上面的示例中,它将是 [0,2]
。我需要这些索引 select 原始列表中的成员,在本例中为 A1
和 B1
.
在value_array = [8,8,4,8]
的情况下,函数应该return[0,1]
。
这个问题很简单,很容易解决(我在这里也看到了同样的问题:np.argmax(value_array)
但它只是 returns 第一个最大值的索引。我能做的是从数组中删除这个元素并再次调用相同的函数,但我不知道这是否是最快的方法,因为我然后调用和计算最大值两次以及从中删除元素值数组。
我的另一个想法是为成员创建一个 class 以赋予他们属性 type
和 value
。然后可以检查 属性 类型,但我觉得这只会使它变慢并且不必要地复杂化(我不知道 属性 检查在 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]