如何在Python中按行总和升序排序矩阵?

3

这个问题在MATLAB中已经有了完全相同的解答

我的问题是:给定一个矩阵,按行元素的和升序排序。 也就是说,如果A是以下矩阵:

A = [[9, 8, 7],
     [2, 5, 7], 
     [1, 3, 4]]

因此,我会得到:
B = [[1, 3, 4],
     [2, 5, 7], 
     [9, 8, 7]]

因为A的第1行之和为24,第2行之和为14,第3行之和为8,所以B的第1行将是A的第3行,第2行将是A的第2行,第3行将是A的第1行。如果可能的话,建议使用内置函数解决此问题。我不需要算法。

使用列表对象的 sort 方法(或 sorted 自由函数),并将 sum 作为 key 传递。因此,sorted(A, key=sum) 应该可以工作(或类似的东西,我还没有测试过)。 - scott_fakename
2个回答

7
有一个内置函数sorted可以实现这个功能。命令为:
sorted(A, key=sum)

给出所需的输出:

[[1, 3, 4], [2, 5, 7], [9, 8, 7]]

1
谢谢。如果我想使用列的总和怎么办? - drzbir
然后您可以先转置矩阵,再应用相同的函数。 - Cleb
谢谢。我错过了那个,是我的错。 - drzbir
我收到了这个错误,有人能提供解决方法吗? ValueError: 数组的真值在具有多个元素时是不明确的。请使用 a.any() 或 a.all()。 - mattsmith5
@mattsmith5:最好开一个新问题并链接到这个问题作为参考。现在很难帮助你,因为我们不知道你的输入是什么。 - Cleb
嗨 @Cleb,我的同事刚在这里发布了一个问题 https://stackoverflow.com/questions/66900594/python-sort-numpy-valueerror-the-truth-value-of-an-array-with-more-than-one-ele - mattsmith5

3
如果您使用的是NumPy,那么这将是:
B = A[np.argsort(A.sum(axis=1))]

在NumPy数组中,使用sum函数计算每一行的和,使用argsort函数计算最小、第二小等和对应的索引,然后使用A[...]选择这些索引对应的行。需要注意的是,A必须是一个NumPy数组,而不是列表嵌套的列表。

如果要处理列,可以使用如下代码:

B = A[:, np.argsort(A.sum(axis=0))]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接