これが重複した質問である場合は事前に申し訳ありません。この情報を探しましたが、まだ見つかりませんでした。
N個の最大要素のインデックスを降順で非常に効率的に使用して、numpy配列(またはpythonリスト)を配置することは可能ですか?
たとえば、配列は次のとおりです。
a = array([4, 1, 0, 8, 5, 2])
降順の最大要素のインデックスは次のようになります (N = 6 を考慮すると、すべての要素が含まれます)。
8 --> 3
5 --> 4
4 --> 0
2 --> 5
1 --> 1
0 --> 2
result = [3, 4, 0, 5, 1, 2]
私はややばかげたアプローチ(配列をソートし、インデックスのN個の数字のそれぞれを検索するなど)を使用してそれを作成する方法を知っていますが、ボトルネックやヒープqのような効率的なライブラリがあるかどうか、または作成するためのpythonicアプローチがあるかどうか疑問に思っていましたこれは非常に高速です。それぞれ 300k の要素を持ついくつかの配列に適用する必要があるため、パフォーマンスが問題になります。
前もって感謝します!
アップデート
私は答えを読んで、300kのランダムな整数を使用して時間を計ることにしました。結果は次のとおりです。
ソリューション 1: sorted(range(len(a)), key=lambda i:a[i])
時間: 230 ミリ秒
解決策 2: heapq.nlargest(len(a), zip(a, itertools.count()))
時間: 396 ミリ秒
解決策 3: heapq.nlargest(len(a), enumerate(a), key=operator.itemgetter(1))
時間: 864 ミリ秒
解決策 4: def f(a,N): return np.argsort(a)[::-1][:N] (N = len(a))
時間: 104 ミリ秒
迅速で非常に良い回答をありがとうございます!