如何按总和最大的列对二维 numpy 数组进行排序

How to sort a 2d numpy array by the columns with the biggest sum

我有一个形状为 (35,6004) 的二维数组,我想根据列的总和对其进行排序。所以如果我有例如

array([[5, 3, 13], 
       [1, 2, 20],
       [6, 2,  6]])

我想像这样对我的数组进行排序

array([[13, 5, 3], 
       [20, 1, 2],
       [6 , 6, 2]]).

我试着找到列的索引

def find_max_col(o):
    t = o.sum(axis=0)
    te = t.tolist()
    return te.index(t.max())

然后我使用该函数的输出对数组进行排序

test = array[array[:, find_max_col(array)].argsort()]

并执行此操作以检查是否成功

t1 = test.sum(axis=0)
print(t1)

据我了解,如果我根据总和最大的列进行排序,我应该得到一个数组,该数组以降序形式显示所有列的总和作为上述代码的输出。

我用于检查是否工作错误的代码是我在排序时犯了错误还是我什至没有找到要排序的列的正确索引?

我不确定你的解决方案是否不正确,但它肯定比必要的更复杂:

>>> a = np.array([[5, 3, 13],
                  [1, 2, 20],
                  [6, 2,  6]])

>>> a[:, a.sum(axis=0).argsort()]  # sort columns small-to-large
array([[ 3,  5, 13],
       [ 2,  1, 20],
       [ 2,  6,  6]])

>>> a[:, (a.sum(axis=0)*-1).argsort()]  # multiply sums by -1 to sort large-to-small
array([[13,  5,  3],
       [20,  1,  2],
       [ 6,  6,  2]])

如果您想按总和的降序对列进行排序,请执行此操作。

idx = array.sum(axis=0).argsort()[::-1]
print(array[:,idx])

你的测试是正确的,它没有给出正确答案这一事实意味着你在其他地方犯了错误。既然你想对列进行排序,test 应该至少是

test = array[:,array[:, find_max_col(array)].argsort()]

碰巧 array[:, find_max_col(array)].argsort() 对于您的确切示例给出了正确的答案,但是出于错误的原因。您正在计算最高总和的列的排序索引,即 array[:,2] == array([13, 20, 6]),而您应该按降序对列总和的索引进行排序,即 array.sum(axis=0) == array([12, 7, 39]).