3 回答

TA貢獻1757條經驗 獲得超7個贊
argsort應用于展平陣列:
In [110]: np.argsort(arr1.ravel())
Out[110]: array([3, 0, 1, 2, 5, 4, 7, 6])
將其轉換為 2d 索引:
In [111]: np.unravel_index(_,(2,4))
Out[111]: (array([0, 0, 0, 0, 1, 1, 1, 1]), array([3, 0, 1, 2, 1, 0, 3, 2]))
將數組合并為一個,并重塑:
In [112]: np.transpose(_)
Out[112]:
array([[0, 3],
[0, 0],
[0, 1],
[0, 2],
[1, 1],
[1, 0],
[1, 3],
[1, 2]])
In [113]: _+1 # tweak values to match yours
Out[113]:
array([[1, 4],
[1, 1],
[1, 2],
[1, 3],
[2, 2],
[2, 1],
[2, 4],
[2, 3]])
In [114]: _.reshape(2,4,2)
Out[114]:
array([[[1, 4],
[1, 1],
[1, 2],
[1, 3]],
[[2, 2],
[2, 1],
[2, 4],
[2, 3]]])

TA貢獻1803條經驗 獲得超6個贊
使用 np.argsort 應該可以解決問題:
matrix_1=np.array([[2,3,4,1],[6,5,9,7]])
matrix_1
array([[2, 3, 4, 1],
[6, 5, 9, 7]])
x = np.argsort(matrix_1,axis=1)
array([[3, 0, 1, 2],
[1, 0, 3, 2]], dtype=int64)
由浮點數組成的矩陣不應該造成問題。
然后,您可以將列表創建為:
[[(i+1,v+1) for v in enumerate(y)] for i, y in enumerate(x.tolist())]
[[(1, 4), (1, 1), (1, 2), (1, 3)], [(2, 2), (2, 1), (2, 4), (2, 3)]]

TA貢獻1812條經驗 獲得超5個贊
您必須來自 R 或其他開始索引的語言1。在 Python 中,索引從 開始0,因此您必須顯式添加+ 1索引以使其從 1 開始。
使用argsort然后reshape
m1 = matrix_1.argsort(1) + 1
i = (np.repeat(np.arange(m1.shape[0]), m1.shape[1]) + 1).reshape(m1.shape)
np.concatenate([m1[:, None],i[:, None]], axis=1).swapaxes(2,1)
哪個輸出
array([[[4, 1],
[1, 1],
[2, 1],
[3, 1]],
[[2, 2],
[1, 2],
[4, 2],
[3, 2]]])
添加回答
舉報