【问题标题】:Sorting a python array/recarray by column按列对python数组/recarray进行排序
【发布时间】:2011-10-13 17:06:56
【问题描述】:

关于如何按给定列对整个数组/recarray 进行排序,我有一个相当简单的问题。例如,给定数组:

import numpy as np
data = np.array([[5,2], [4,1], [3,6]])

我想按要返回的第一列对数据进行排序:

array([[3,6], [4,1], [5,2]])

【问题讨论】:

    标签: python arrays sorting numpy recarray


    【解决方案1】:

    使用data[np.argsort(data[:, 0])],其中0 是要排序的列索引:

    In [27]: import numpy as np
    
    In [28]: data = np.array([[5,2], [4,1], [3,6]])
    
    In [29]: col = 0
    
    In [30]: data=data[np.argsort(data[:,col])]
    Out[30]: 
    array([[3, 6],
           [4, 1],
           [5, 2]])
    

    【讨论】:

    • 如何调整它以按多列排序(一列优先级更高)?
    【解决方案2】:

    您正在寻找operator.itemgetter

    >>> from operator import itemgetter, attrgetter
    
    >>> sorted(student_tuples, key=itemgetter(2))
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    
    >>> sorted(student_objects, key=attrgetter('age'))
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    

    In [7]: a
    Out[7]: [[5, 2], [4, 1], [3, 6]]
    
    In [8]: sorted(a, key=operator.itemgetter(0))
    Out[8]: [[3, 6], [4, 1], [5, 2]]
    

    【讨论】:

      【解决方案3】:

      要对第二列进行排序,请使用itemgetter

      >>> from operator import itemgetter
      >>> data = [[5,2], [4,1], [3,6]]
      >>> sorted(data)
      [[3, 6], [4, 1], [5, 2]]
      >>> sorted(data,key=itemgetter(1))
      [[4, 1], [5, 2], [3, 6]]
      >>> 
      

      【讨论】:

        【解决方案4】:

        这有点棘手:

        data[data[:,0].argsort()]
        
        # data[:,n] -- get entire column of index n
        # argsort() -- get the indices that would sort it
        # data[data[:,n].argsort()] -- get data array sorted by n-th column
        

        我在这里找到了这个食谱:

        http://www.scipy.org/NumPy_for_Matlab_Users

        http://mathesaurus.sourceforge.net/matlab-numpy.html

        【讨论】:

          【解决方案5】:

          这是一个适用于切片的扩展:

          import numpy as np
          x = np.array([[9, 1, 2],
                        [5, 3, 4],
                        [0, 5, 6]])
          

          按行排序:

          x[:, x[1,:].argsort()] # Sort by second row
          
          array([[1, 2, 9]
                 [3, 4, 5]
                 [5, 6, 0]])
          

          按列排序:

          x[x[:,0].argsort(), :] # Sort by first column
          
          array([[0, 5, 6],
                 [5, 3, 4],
                 [9, 1, 2]])
          

          【讨论】:

          • 我可以使用 argsort() 以类似的方式按降序对所有矩阵列进行排序吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-12
          • 2016-12-29
          相关资源
          最近更新 更多