我知道我們可以通過以下方式基于行對 2D numpy 陣列的列進行排序:
a = np.array([[1,4,7],
[3,1,5],
[9,5,8]])
a = a[:, a[1, :].argsort()]
Out: [[4,1,7],
[1,3,5],
[5,9,8]]
請注意,這確實是我想要的。第二行(索引 = 1)現在已排序,第 0 行和第 2 行中的值也相應地移動。即,列位置根據第 1 行的排序順序發生變化。
但是現在我的問題是:我沒有 2D 陣列,而是 3D 陣列(即 2D 陣列的陣列)。
a = np.array([[[1,4,7],
[3,1,5],
[9,5,8]],
[[2,8,7],
[3,8,1],
[9,2,8]]])
我仍然想根據各自第 1 行的值對 2D 陣列的列進行單獨排序。所需的結果是:
([[[4,1,7],
[1,3,5],
[5,9,8]],
[[7,2,8],
[1,3,8],
[8,9,2]]])
我嘗試了以下但結果并不如預期:
a = a[:, :, a[: , 1, :].argsort()]
uj5u.com熱心網友回復:
嘗試np.take_along_axis:
np.take_along_axis(a,a[:,1].argsort()[:,None], axis=2)
出去:
array([[[4, 1, 7],
[1, 3, 5],
[5, 9, 8]],
[[7, 2, 8],
[1, 3, 8],
[8, 9, 2]]])
老實說,不要問我為什么它有效:-)
uj5u.com熱心網友回復:
您可以使用組合numpy.argsort和numpy.take_along_axis:
idx = np.argsort(a, axis=2)
np.take_along_axis(a, idx[:,None,1], axis=2)
它的作業原理是從中獲取排序順序argsort,然后僅保留相關行(此處為 1),重新整形以廣播take_along_axis對所有其他行的操作。
輸出:
array([[[4, 1, 7],
[1, 3, 5],
[5, 9, 8]],
[[7, 2, 8],
[1, 3, 8],
[8, 9, 2]]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338752.html
