python - NumPy:按非零条目数对矩阵行进行排序

标签 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

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

最佳答案

如果你有一个数组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的行。

附注如果您有一个矩阵m(而不是数组),您可能需要在使用argsort之前进行解析:

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

关于python - NumPy:按非零条目数对矩阵行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28518568/

相关文章:

python - 关于仅在使用 pd.to_datetime 后保留日期信息

python - C中的numpy数组类型转换

python - Django:以编程方式/动态创建数据库表

sorting - Directory.GetFiles 按日期排序

python - 同时迭代多个列表并捕获值的差异

javascript - 如何忽略拓扑排序中的循环?

python - 无法理解排序()键参数内的 lambda 函数

python - 如何在 64 位 Windows 上安装 SciPy?

python - PyMySQL 和 OrderedDict

python - 在Python中,如何提取较长字符串中跨越某个索引的所有子字符串?