所以我有以下情況。我有一個包含 4 個成員的 python 串列:[A1,A2,B1,B2]我有一個函式可以計算它們的值并回傳一個 Numpy 整數陣列,例如[8,5,9,7]. 我需要提取具有最高值的兩個成員,其中型別 A 的成員比型別 B 的重要性更高(在搶七的情況下)。換句話說,我需要陣列中前兩個最大值的索引。在上面的例子中,那將是[0,2]. 我需要這些索引來選擇原始串列中的成員,在這種情況下A1和B1.
在 的情況下value_array = [8,8,4,8],函式應該回傳[0,1]。這個問題很簡單,很容易解決(我在這里也看到了同樣的問題:寫一個函式來查找前兩個最大數字的索引),但我正在尋找計算效率最高的實作。因為我知道 python 很慢,所以我認為使用內置的 Numpy 函式是要走的路,以避免慢回圈。我用過np.argmax(value_array),但它只回傳第一個最大值的索引。我可以做的是從陣列中洗掉這個元素并再次呼叫相同的函式,但我不知道這是否是最快的方法,因為我然后呼叫并計算最大值兩次以及從陣列中洗掉元素值陣列。
我的另一個想法是為成員創建一個類,為他們提供屬性type和value. 然后可以檢查 type 屬性,但我覺得這只會使它變慢并且不必要地復雜(我不知道 Python 中的屬性檢查有多快)。
有沒有人有一個聰明的解決方案來獲取 Numpy 整數陣列中前兩個最高數字的索引?
uj5u.com熱心網友回復:
您可以使用np.argpartition查找陣列中的第 k 個最小值(以及分別為第 (nk) 個最大值)。結果值是無序的。如果您希望它們排序,那么您需要對最大值的結果陣列進行排序。該解決方案比對整個陣列進行排序要快得多(排序及時運行,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]
uj5u.com熱心網友回復:
您可以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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433853.html
