用原始索引排序

时间:2020-01-04 18:38:27

标签: python numpy

我有一个矩阵,例如:[[4 5 6] [1 2 3] [7 8 9]]

,并需要每行的平均值(5、2、8)。问题出在我需要按每行的平均值进行排序并将其与要打印其平均值的行的原始索引一起打印时。

输出应首先显示索引,然后显示如下平均值:[2:2,1:5,3:8]

到目前为止,我还不知道如何对其建立索引...

average = []

for i in range(m):
    k = numpy.mean(A[i])
    average.append(k)
average.sort()
print(average)

3 个答案:

答案 0 :(得分:1)

由于使用的是numpy,因此应避免显式循环。当您可以使用以下代码时,没有理由遍历列表并在每个元素上调用np.mean()

average = m.mean(axis=1)

一次完成所有操作。

然后可以使用各种堆栈实用程序之一在索引上进行堆栈:

stacked = np.stack((np.indices(average.shape).reshape(-1),average), axis=-1)

这将为您提供一个堆叠的数组,例如:

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

您可以使用argsort()对第二个元素进行排序:

import numpy as np

m = np.array([[ 4, 5 ,6 ], [ 1, 2, 3 ], [ 7, 8, 9 ]])    
average = m.mean(axis=1)
stacked = np.stack((np.indices(average.shape).reshape(-1),average), axis=-1)
stacked[stacked[:, 1].argsort()]

结果:

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

有了它,您应该能够创建所需的最终输出。

答案 1 :(得分:0)

这可以通过sorted()lambda来实现。看:

Python 3.7.5 (default, Dec 15 2019, 17:54:26) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [[4, 5, 6], [1, 2, 3], [7, 8, 9]] 
>>> sorted(a, key=lambda x: sum(x)/len(x))
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> 

或者,如果您真的希望对平均值进行排序:

>>> sorted([sum(_)/len(_) for _ in a])
[2.0, 5.0, 8.0]
>>> 

要在a中获得行索引及其平均值,请执行以下操作:

>>> sorted([(i, sum(v)/len(v)) for i,v in enumerate(a)], key=lambda x: x[1])
[(1, 2.0), (0, 5.0), (2, 8.0)]
>>> 

最后,要使行及其平均值按平均值排序,您只需要执行以下操作:

>>> sorted([(_, sum(_)/len(_)) for _ in a], key=lambda x: x[1])
[([1, 2, 3], 2.0), ([4, 5, 6], 5.0), ([7, 8, 9], 8.0)]
>>> 

答案 2 :(得分:0)

您可以做到:

import numpy
m = [[ 4, 5, 6 ] ,[ 1, 2, 3 ], [ 7, 8, 9 ]]

result = []
for idx,val in enumerate(m, 1):
    result.append((idx, int(numpy.mean(val))))

result_sorted = sorted(result, key=lambda x: x[1])
print (dict(result_sorted))

输出:

{2:2,1:1:5,3:8}