我正在嘗試在 Python 中對具有雙索引的多元組進行排序。我想按它的第二個索引對其進行排序。元組輸出,即“print(max_values)”的輸出,如下所示:
(array([[4.15498641]]), 1)
(array([[2.31940546]]), 4)
(array([[0.96185454]]), 8)
(array([[1.29915758]]), 11)
(array([[1.66805024]]), 5)
(array([[1.25312376]]), 13)
(array([[1.81367542]]), 7)
(array([[3.16895748]]), 14)
(array([[3.74632224]]), 0)
(array([[4.87073571]]), 10)
(array([[1.8860763]]), 12)
(array([[1.25379793]]), 6)
(array([[0.60556452]]), 15)
(array([[3.09510515]]), 3)
(array([[2.7700944]]), 9)
(array([[2.65579492]]), 2)
我想要做的正是,這是根據您看到的元組的第二個索引將這些元組按順序排列。
例如,在我添加的輸出中,第一個元組的第二個索引是1,而第二個元組的第二個索引是4。我想要做的是將第二個索引設定為等于2。
我還添加了完整代碼,“takeSecond”功能不起作用。
import numpy as np
import random
random.seed(2)
np.random.seed(2)
x_train = [(np.random.randn(1,3),0), (np.random.randn(1,3),1), (np.random.randn(1,3),2) , (np.random.randn(1,3),3),
(np.random.randn(1,3),4), (np.random.randn(1,3),5), (np.random.randn(1,3),6) , (np.random.randn(1,3),7),
(np.random.randn(1,3),8), (np.random.randn(1,3),9), (np.random.randn(1,3),10), (np.random.randn(1,3),11),
(np.random.randn(1,3),12),(np.random.randn(1,3),13),(np.random.randn(1,3),14), (np.random.randn(1,3),15)]
neurons = [(np.random.randn(3,1),0), (np.random.randn(3,1),1), (np.random.randn(3,1),2),
(np.random.randn(3,1),3), (np.random.randn(3,1),4), (np.random.randn(3,1),5),
(np.random.randn(3,1),6), (np.random.randn(3,1),7), (np.random.randn(3,1),8)]
def takeSecond(elem):
return elem[1]
#%%
random.shuffle(x_train)
for i in range (len(x_train)):
results = []
winning_neurons = []
for j in range (len(neurons)):
result = np.dot(x_train[i][0],neurons[j][0])
results.append((result,x_train[i][1]))
#results.sort(key=takeSecond)
#print(results)
max_values = max(results)
print(max_values)
max_index = results.index(max_values)
winning_neurons.append(max_index)
#print(winning_neurons)
互聯網上的其他元組排序功能不起作用,并給出了諸如“索引錯誤”或“排序()函式不適用于元組”之類的錯誤。
你能幫我整理一下嗎?先感謝您。
uj5u.com熱心網友回復:
這可能是你想要的:
out = sorted(max_values, key=lambda x: x[1])
輸出:
[(array([[3.74632224]]), 0),
(array([[4.15498641]]), 1),
(array([[2.65579492]]), 2),
(array([[3.09510515]]), 3),
(array([[2.31940546]]), 4),
(array([[1.66805024]]), 5),
(array([[1.25379793]]), 6),
(array([[1.81367542]]), 7),
(array([[0.96185454]]), 8),
(array([[2.7700944]]), 9),
(array([[4.87073571]]), 10),
(array([[1.29915758]]), 11),
(array([[1.8860763]]), 12),
(array([[1.25312376]]), 13),
(array([[3.16895748]]), 14),
(array([[0.60556452]]), 15)]
uj5u.com熱心網友回復:
您需要實際takeSecond用作key函式來獲得所需的行為。results.sort(key=takeSecond)確實對串列進行了排序,但該順序對呼叫 沒有影響max(),并且您不會results在其他任何地方使用排序后的串列。
默認情況下,該max方法采用元組中的第一項進行比較,因此您也需要在key此處傳遞 a :
max_values = max(results, key=takeSecond)
在您的示例資料中,這將回傳(array([[0.60556452]]), 15).
如果您只需要基于此條件的最大元組,則使用max()比對整個results串列進行排序更好。如果您results無論如何都需要排序,則無需使用max(),最大元組將在results[-1],自此以來的最后一項results.sort(key=takeSecond)將按升序排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/400873.html
