我想根據一個串列的值對兩個嵌套串列進行排序。
predictions = np.array([[0, 1, 2, 3], [3, 2, 1, 0], [1, 2, 3, 0], [-1, -1, -1, -1]])
test_interaction_matrix = np.array([[1, 0, 0, 0], [0, 1, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0]])
for i,(p,t) in enumerate(zip(predictions, test_interaction_matrix)):
list1, list2 = (list(t) for t in zip(*sorted(zip(p, t))))
print(list1, list2)
排序標準取決于 test_interaction_matrix 的值,如果是 1 則將預測中的相應元素放在前面。位置的變化應該發生在兩個串列中。例如,我希望預測中的第一個串列看起來像 [0,3,2,1],而 test_interaction_matrix 中的相應串列像 [1,0,0,0],下一個 [2,0,3,1] 和[1,1,0,0] 等等。現在列印串列,我上面的代碼沒有得到正確的結果。謝謝!
uj5u.com熱心網友回復:
如果我正確理解了這個問題,以下應該有效:
import numpy as np
predictions = np.array([[0, 1, 2, 3],
[3, 2, 1, 0],
[1, 2, 3, 0],
[-1, -1, -1, -1]])
test_interaction_matrix = np.array([[1, 0, 0, 0],
[0, 1, 0, 1],
[0, 0, 0, 0],
[0, 0, 0, 0]])
r = predictions.shape[0]
sp = np.flip(predictions.argsort(axis=1), axis=1)
p = predictions[np.c_[:r], sp]
t = test_interaction_matrix[np.c_[:r], sp]
s = (-t).argsort(axis=1, kind="stable")
p = p[np.c_[:r], s]
t = t[np.c_[:r], s]
print(f"p:\n{p}\n\nt:\n{t}")
它給:
p:
[[ 0 3 2 1]
[ 2 0 3 1]
[ 3 2 1 0]
[-1 -1 -1 -1]]
t:
[[1 0 0 0]
[1 1 0 0]
[0 0 0 0]
[0 0 0 0]]
uj5u.com熱心網友回復:
您可以使用串列推導進行快速方法:
predictions = np.array([[0, 1, 2, 3], [3, 2, 1, 0], [1, 2, 3, 0], [-1, -1, -1, -1]])
test_interaction_matrix = [[1, 0, 0, 0], [0, 1, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0]])
pred = predictions.tolist()
order = test_interaction_matrix.tolist()
[list(zip(*sorted(zip(pred[i], order[i]), key=lambda pair: (pair[1], pair[0]), reverse=True)))[0] for i in range(len(pred))]
此代碼回圈遍歷陣列 ( for i in range(len(pred))) 中的每個位置。
第 1 步:對于每個位置,它將陣列中的元素配對 ( zip(pred[i], order[i])):
[[(0,1), (1,0), (2,0), (3,0)], [(3,0), (2,1), (1,0), (0,1)], [...], ...]
第 2 步:對陣列中的對進行排序 ( sorted(zip(...), key=lambda pair: (pair[1], pair[0]), reverse=True)):
key引數指示它將如何應用排序:它將優先考慮您的 test_interaction_matrix 值,然后是預測值。Reverse設定為 True 以便您獲得后代順序。
[[(0,1), (3,0), (2,0), (1,0)], [(2,1), (0,1), (3,0), (1,0)], [...], ...]
第 3 步:將重建原始向量 test_interaction_matrix 和預測 ( ),簡而言之,它是第 1 步list(zip(*sorted(...)))的逆運算:
[[(0, 3, 2, 1), (1, 0, 0, 0)], [(2, 0, 3, 1), (1, 1, 0, 0)], [...], ...]
第 4 步:獲取第一個陣列 ( list(...)[0]),它對應于預測一個,這次排序:
[(0, 3, 2, 1), (2, 0, 3, 1), (3, 2, 1, 0), (-1, -1, -1, -1)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475356.html
