Python 3.x 如何使用argsort输出对多维数组进行排序

Python 3.x 如何使用argsort输出对多维数组进行排序,python-3.x,numpy,sorting,indexing,numpy-ndarray,Python 3.x,Numpy,Sorting,Indexing,Numpy Ndarray,我有一个“数组列表”,并使用argsort对每个数组进行排序: import numpy as np arr = np.array([[4, 2, 5], [4, 3, 1], [1, 5, 7], [1, 5, 4]]) idxs = arr.argsort(axis=1) idxs >>> array([[1, 0, 2], [2, 1, 0], [0, 1, 2], [0, 2, 1]]) 对于这

我有一个“数组列表”,并使用argsort对每个数组进行排序:

import numpy as np    
arr = np.array([[4, 2, 5], [4, 3, 1], [1, 5, 7], [1, 5, 4]])
idxs = arr.argsort(axis=1)
idxs
>>> array([[1, 0, 2],
           [2, 1, 0],
           [0, 1, 2],
           [0, 2, 1]])
对于这4个数组中的每一个,我都有3x3个矩阵,保存在“矩阵列表”中:

arr2.shape
>>> (4, 3, 3)
我想使用idxs对每个数组的列进行排序。对于第一个矩阵,我想重新排列列,如下所示

m1 = arr2[0]
m1 = [:, [1, 0, 2]]
仅将方括号中的IDX赋给arr2是行不通的,甚至尝试将IDX应用于它们所来自的阵列也是行不通的:

arr[arr.argsort(arr, axis=1)].shape
>>> (4, 3, 3)

您可以使用对索引:

arr2 = np.arange(3*4*3).reshape(4,3,-1)

arr2[np.arange(arr2.shape[0])[:,None],:, idxs]
输出:

array([[[ 1,  4,  7],
        [ 0,  3,  6],
        [ 2,  5,  8]],

       [[11, 14, 17],
        [10, 13, 16],
        [ 9, 12, 15]],

       [[18, 21, 24],
        [19, 22, 25],
        [20, 23, 26]],

       [[27, 30, 33],
        [29, 32, 35],
        [28, 31, 34]]])

我不确定我是否正确理解了这个问题,但是您可以使用对所有值进行排序,然后返回的索引可以直接用于数组中,以argsort返回的顺序对所有项进行排序,在任何情况下
idx=argsort();数组[idx]
。如果这不是你想要的,请更新你的问题。我再次阅读了你的问题,
[:,[2,0,1]
不是一个有效的单一作业,这也让我困惑了很多次,但是
[np.arange(3),[2,0,1]
是一个有效的单一作业。[np.arange(3),[2,0,1]]不起作用。只是,正如Quang Hoang所建议的,arr[np.arange(arr.shape[0])[:,None],idxs]为arr做了工作。但是对于arr2,它会更改行而不是列。非常感谢您的回答。但是,我想用它来排序arr2。arr2[np.arange(arr2.shape[0])[:,None],idxs]交换行。arr2[np.arange(arr2.shape[0])[:,None],idxs,:]也不起作用。我当然可以在之前使用交换盘,交换行,然后再交换回。关于你的注意事项:我可以这样做来排序arr,但我想使用这些索引来排序arr2。@Pickniclas看到更新的答案。我尝试过这个,但没有用,是吗?第一个数组的列应该是[1,4,7],但它是[3,0,6]。@Pickniclas抱歉,粘贴了错误的输出。第一行确实是
[1,4,7]
。请注意索引中额外的
。你在之前的评论中没有提到这一点