如何根据特定行中的值对numpy数组进行排序?

too*_*y44 5 python arrays sorting numpy

我想知道如何通过其中一列中的值对整个数组进行排序.

我有 :

array([5,2,8,2,4])
Run Code Online (Sandbox Code Playgroud)

和:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
Run Code Online (Sandbox Code Playgroud)

我想将第一个数组附加到第二个数组,如下所示:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [5,  2,  8,  2,  4]])
Run Code Online (Sandbox Code Playgroud)

然后通过附加行对数组进行排序以获得以下结果:

array([[1,  3,  4,  0,  2],
       [6,  8,  9,  5,  7],
       [11, 13, 14, 10, 12],
       [16, 18, 19, 15, 17],
       [21, 23, 24, 20, 22],
       [2,  2,  4,  5,  8]])
Run Code Online (Sandbox Code Playgroud)

或这个:

array([[ 2,  1,  3,  4,  0],
       [ 7,  6,  8,  9,  5],
       [12, 11, 13, 14, 10],
       [17, 16, 18, 19, 15],
       [22, 21, 23, 24, 20],
       [ 8,  5,  4,  2,  2]])
Run Code Online (Sandbox Code Playgroud)

然后删除附加列以获取:

array([[1,  3,  4,  0,  2],
       [6,  8,  9,  5,  7],
       [11, 13, 14, 10, 12],
       [16, 18, 19, 15, 17],
       [21, 23, 24, 20, 22]])
Run Code Online (Sandbox Code Playgroud)

要么:

array([[ 2,  1,  3,  4,  0],
       [ 7,  6,  8,  9,  5],
       [12, 11, 13, 14, 10],
       [17, 16, 18, 19, 15],
       [22, 21, 23, 24, 20]])
Run Code Online (Sandbox Code Playgroud)

是否有执行此过程的代码.我是python的新手.非常感谢!

pez*_*ode 9

您可以使用numpy.argsort获取包含数组的已排序索引的列表.然后使用它可以重新排列矩阵的列.

import numpy as np

c = np.array([5,2,8,2,4])    
a = np.array([[ 0,  1,  2,  3,  4],
              [ 5,  6,  7,  8,  9],
              [10, 11, 12, 13, 14],
              [15, 16, 17, 18, 19],
              [20, 21, 22, 23, 24]])

i = np.argsort(c)
a = a[:,i]
Run Code Online (Sandbox Code Playgroud)

  • `argsort`返回一个索引数组,用于对数组进行排序.`i`中的第一个元素是`c`中具有最低值的位置,等等.你可以使用列表来索引numpy数组,所以`c [i]`会给你排序的`c`版本.将其扩展到2D数组,您可以使用列表选择一堆行或(在本例中)列.你想要按照`i`指定的顺序排列,但是你希望所有的行都不受影响,因此`:`(这是一个覆盖所有行的切片).你应该找到一个关于numpy切片和索引的教程,因为它真的很重要. (2认同)