首页 > 解决方案 > 如何按总和最大的列对二维 numpy 数组进行排序

问题描述

我有一个形状为 (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)

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

我的检查代码是否工作错误,我是否在排序中犯了错误,或者我什至没有找到要排序的列的正确索引?

标签: pythonnumpy-ndarraycolumnsorting

解决方案


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

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])


推荐阅读