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