NumPy:按非零条目数排序矩阵行

时间:2015-02-14 18:05:44

标签: python sorting numpy matrix

import numpy as np

def calc_size(matrix, index):
    return np.nonzero(matrix[index,:])[1].size

def swap_rows(matrix, frm, to):
    matrix[[frm, to],:] = matrix[[to, frm],:]

Numpy - Python 2.7

如何实现矩阵的行按非零条目的大小排序?我已经编写了这两种方法来完成工作,但我需要将它提供给排序引擎?最完整的行应该在开头!

1 个答案:

答案 0 :(得分:2)

如果你有一个数组arr

array([[0, 0, 0, 0, 0],
       [1, 0, 1, 1, 1],
       [0, 1, 0, 1, 1],
       [1, 1, 1, 1, 1]])

您可以根据零条目的数量对数组的行进行排序:

>>> arr[(arr == 0).sum(axis=1).argsort()]
array([[1, 1, 1, 1, 1],
       [1, 0, 1, 1, 1],
       [0, 1, 0, 1, 1],
       [0, 0, 0, 0, 0]])

首先使用(arr == 0).sum(axis=1)计算每行中的零条目数:这会生成数组[5, 1, 2, 0]

接下来,argsort按照相应的值对此数组的索引进行排序,得到[3, 1, 2, 0]

最后,这个argsorted数组用于重新排列arr的行。

P.S。如果你有一个矩阵m(而不是一个数组),你可能需要在使用argsort之前进行调整:

m[(m == 0).sum(axis=1).ravel().argsort()]