萧十郎
这里我们可以用一个简单的例子来演示你的代码在做什么:首先我们创建一个随机的 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]只是第一个二维数组中的第一行a,即:a[:][0]# array([[3, 1],# [3, 7],# [0, 3]])a[:][0][0]# array([3, 1])你想要的是3,2,9这个例子中的标题,所以我们可以a[:, 0, 0]用来提取它们:a[:,0,0]# array([3, 2, 9])现在我们对上面的列表进行排序并得到一个索引数组:np.argsort(a[:,0,0])# array([1, 0, 2])为了重新排列整个 3D 数组,我们需要以正确的顺序对数组进行切片。并且np.arange(len(a))[:,np.newaxis]等于np.arange(len(a)).reshape(-1,1)创建一个连续的二维索引数组:np.arange(len(a))[:,np.newaxis]# array([[0],# [1],# [2]])没有二维数组,我们将数组切片为二维a[np.arange(3), np.argsort(a[:,0,0])]# array([[3, 7],# [2, 9],# [8, 0]])使用 2D 数组,我们可以执行 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]]])以上就是你想要的最终结果。编辑:要排列二维数组:,可以使用: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]]])