使用原始索引排序

2024-04-25 09:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个矩阵像:[[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)

Tags: innumpyfor排序range矩阵meansort
3条回答

因为您使用的是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.]])

有了它,您应该能够创建您想要的最终输出。你知道吗

这可以通过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)]
>>> 

你可以这样做:

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:5,3:8}

相关问题 更多 >