【问题标题】:How to sort an nx3 numpy array by column(s) but it remembers the data in that row?如何按列对 nx3 numpy 数组进行排序,但它会记住该行中的数据?
【发布时间】:2019-12-19 19:59:37
【问题描述】:

首先,我对 python 很陌生,因此非常感谢任何提示/帮助。

基本上,我希望一个 nx3 numpy 数组最初按第二列排序,然后按第三列排序,但我希望该行中的所有数据彼此保留。

像这样:

import numpy as np

a = np.array([[20, 2, 4],
              [7, 5, 6],
              [25, 1, 5],
              [2, 2, 3],
              [3, 5, 8],
              [4, 1, 3]])
              ......... (n times)

在这个数组中,第一列表示值,第二列表示 x 坐标,第三列表示 y 坐标。首先通过 x 坐标对数组进行降序排序,然后对 y 坐标进行降序排序,同时值仍然分配给 x 和 y 坐标的最佳方法是什么?

所以排序后是这样的:


a = ([[4, 1, 3],
     [25, 1, 5],
      [2, 2, 3],
     [20, 2, 4],
      [7, 5, 6],
      [3, 5, 8]])
     ......... (n times)

如您所见,它如何首先对 x 坐标进行排序,然后对具有相同 x 坐标的所有 y 坐标进行排序。因为它首先找到 1 的所有 x 坐标,然后在该排序中找到 y 坐标。虽然值、x 和 y 坐标都彼此保持在同一行。

【问题讨论】:

    标签: python arrays numpy sorting


    【解决方案1】:

    最简单的方法是将其转换为 pandas 数据框,这样操作起来就更容易了。

    import pandas as pd
    
    df = pd.DataFrame({'a': [6, 2, 1], 'b': [4, 5, 6]})
    
    print(df)
    

    出来

     a  b
    0  6  4
    1  2  5
    2  1  6
    
    sorteddf = df.sort_values(by='a')
    
    print(sorteddf)
    

    出来

    a  b
    2  1  6
    1  2  5
    0  6  4
    

    【讨论】:

      【解决方案2】:

      看一下'order'参数:https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html

      import numpy as np
      
      dtype = [('x',int),('y',int)]
      values = [(1,7),(3,4),(1,4),(1,3)]
      a = np.array(values,dtype=dtype)
      print(np.sort(a, order=['x','y']))
      

      【讨论】:

        【解决方案3】:

        最简单的方法是先按y排序,再按x排序,所以对于x的equals值,最终结果将按y排序。

        完整代码:

        import numpy as np
        
        a = np.array([[20, 2, 4],
                      [7, 5, 6],
                      [25, 1, 5],
                      [2, 2, 3],
                      [3, 5, 8],
                      [4, 1, 3]])
        
        a = a[a[:,2].argsort()] # sort according to column 2
        a = a[a[:,1].argsort()] # sort according to column 1
        

        结果

        a
        array([[ 4,  1,  3],
               [25,  1,  5],
               [ 2,  2,  3],
               [20,  2,  4],
               [ 7,  5,  6],
               [ 3,  5,  8]])
        

        【讨论】:

          猜你喜欢
          • 2021-09-21
          • 1970-01-01
          • 2011-02-19
          • 1970-01-01
          • 2022-09-28
          • 2017-01-02
          • 2021-05-18
          相关资源
          最近更新 更多