根据总和对数组列进行排序

时间:2018-09-07 06:27:49

标签: python numpy

假设我有一个这样的数组:

np.array([1., 1., 0.],
       [0., 4., 0.],
       [8., 0., 8.],
       [0., 0., 0.],
       [5., 0., 0.],
       [2., 2., 2.]])

第[0]列总计为16,第[1]列总计为6,第[2]列总计为10。

如何有效地在Numpy中按最大到最小列值重新排列数组?在上面的示例中,column [0]将保留在原位置,column [1]和column [2]将切换位置。

6 个答案:

答案 0 :(得分:3)

您可以在sum处尝试axis=0并使用argsort,然后反转数组并使用:

a[:,np.argsort(a.sum(axis=0))[::-1]]

array([[1., 0., 1.],
       [0., 0., 4.],
       [8., 8., 0.],
       [0., 0., 0.],
       [5., 0., 0.],
       [2., 2., 2.]])

答案 1 :(得分:1)

使用np.sumnp.argsort的组合可以达到以下目的:

x = np.array([[1., 1., 0.],[0., 4., 0.],[8., 0., 8.],[0., 0., 0.],[5., 0., 0.],[2., 2., 2.]])
x[:, np.argsort(-np.sum(x, 0))]
array([[ 1.,  0.,  1.],
       [ 0.,  0.,  4.],
       [ 8.,  8.,  0.],
       [ 0.,  0.,  0.],
       [ 5.,  0.,  0.],
       [ 2.,  2.,  2.]])

答案 2 :(得分:1)

以这种方式交换最后两列:

a = np.array([[1., 1., 0.],
             [0., 4., 0.],
             [8., 0., 8.],
             [0., 0., 0.],
             [5., 0., 0.],
             [2., 2., 2.]])

result = a[:, [0, 2, 1]]

因此,您需要的是根据列的总和来计算那些索引[0, 2, 1]

这将为您提供所有列的总和:

a.sum(axis=0)  # array([16.,  7., 10.])

然后,您将获得用于排序的索引:

np.argsort(np.array([16.,  7., 10.]))   # [1, 2, 0]

您需要将其翻转以获得最高到最低的顺序:

np.flip([1, 2, 0])   # [0, 2, 1]

所以,总共是:

result = a[:, np.flip(np.argsort(a.sum(axis=0)))]

答案 3 :(得分:0)

arr = np.array([[1., 1., 0.],
                [0., 4., 0.],
                [8., 0., 8.],
                [0., 0., 0.],
                [5., 0., 0.],
                [2., 2., 2.]])

perm = np.flip(np.argsort(np.sum(arr, axis=0)))
result = a[:, perm]

求和;然后获得对总和进行排序的排列(索引数组)。 argsort以升序排序,因此请颠倒排列,以使索引从最高总和到最低。最后,通过相同的排列对原始数组重新排序。

答案 4 :(得分:0)

您可以执行以下操作:

def main():
    a = np.array([[1., 1., 0.],
                 [0., 4., 0.],
                 [8., 0., 8.],
                 [0., 0., 0.],
                 [5., 0., 0.],
                 [2., 2., 2.]])
    col_sum = np.sum(a, axis=0)
    sort_index = np.argsort(-col_sum) # index sort in descending order
    out_matrix = a[:, sort_index]
    print(out_matrix)

我认为必须要有一个新实例(out_matrix),因为您不能真正地就地切换列。

答案 5 :(得分:0)

或者您可以使用pandas

>>> import pandas as pd, numpy as np
>>> arr=np.array([[1., 1., 0.],
       [0., 4., 0.],
       [8., 0., 8.],
       [0., 0., 0.],
       [5., 0., 0.],
       [2., 2., 2.]])
>>> df=pd.DataFrame(arr)
>>> df.sort_index(axis=1).values
array([[ 1.,  1.,  0.],
       [ 0.,  4.,  0.],
       [ 8.,  0.,  8.],
       [ 0.,  0.,  0.],
       [ 5.,  0.,  0.],
       [ 2.,  2.,  2.]])
>>>