2 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
這里我們可以用一個(gè)簡(jiǎn)單的例子來(lái)演示你的代碼在做什么:
首先我們創(chuàng)建一個(gè)隨機(jī)的 3D numpy 矩陣:
a = (np.random.rand(3,3,2)*10).astype(int)
array([[[3, 1],
[3, 7],
[0, 3]],
[[2, 9],
[1, 0],
[9, 2]],
[[9, 2],
[8, 8],
[8, 0]]])
然后a[:]將給出a自己,并且a[:][0][0]只是第一個(gè)二維數(shù)組中的第一行a,即:
a[:][0]
# array([[3, 1],
# [3, 7],
# [0, 3]])
a[:][0][0]
# array([3, 1])
你想要的是3,2,9這個(gè)例子中的標(biāo)題,所以我們可以a[:, 0, 0]用來(lái)提取它們:
a[:,0,0]
# array([3, 2, 9])
現(xiàn)在我們對(duì)上面的列表進(jìn)行排序并得到一個(gè)索引數(shù)組:
np.argsort(a[:,0,0])
# array([1, 0, 2])
為了重新排列整個(gè) 3D 數(shù)組,我們需要以正確的順序?qū)?shù)組進(jìn)行切片。并且np.arange(len(a))[:,np.newaxis]等于np.arange(len(a)).reshape(-1,1)創(chuàng)建一個(gè)連續(xù)的二維索引數(shù)組:
np.arange(len(a))[:,np.newaxis]
# array([[0],
# [1],
# [2]])
沒(méi)有二維數(shù)組,我們將數(shù)組切片為二維
a[np.arange(3), np.argsort(a[:,0,0])]
# array([[3, 7],
# [2, 9],
# [8, 0]])
使用 2D 數(shù)組,我們可以執(zhí)行 3D 切片并保持形狀:
a[np.arange(3).reshape(-1,1), np.argsort(a[:,0,0])]
array([[[3, 7],
[3, 1],
[0, 3]],
[[1, 0],
[2, 9],
[9, 2]],
[[8, 8],
[9, 2],
[8, 0]]])
以上就是你想要的最終結(jié)果。
編輯:
要排列二維數(shù)組:,可以使用:
a[np.argsort(a[:,0,0])]
array([[[2, 9],
[1, 0],
[9, 2]],
[[3, 1],
[3, 7],
[0, 3]],
[[9, 2],
[8, 8],
[8, 0]]])

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
另一種方法是使用 np.take
header = a[:,0,0] sorted = np.take(a, np.argsort(header), axis=0)
添加回答
舉報(bào)