【问题标题】:Sorting 2D array by the first n rows按前 n 行对二维数组进行排序
【发布时间】:2020-08-14 15:49:11
【问题描述】:

如何在 NumPy 中按前两行对数组进行排序?

例如,

A=array([[9, 2, 2],
         [4, 5, 6],
         [7, 0, 5]])

我想按前两行对列进行排序,以便返回:

A=array([[2, 2, 9],
         [5, 6, 4],
         [0, 5, 7]])

谢谢!

【问题讨论】:

    标签: python arrays list numpy sorting


    【解决方案1】:

    一种方法是将我们想要使用argsort 的二维数组转换为更易于处理的一维数组。为此,一个想法可能是通过在10 序列、sum 它们和 然后 使用 argsort 的幂的幂中连续减小值来将行相乘以考虑排序目的(注意:对于 k 的高值,此方法在数值上不稳定。适用于高达 ~20 的值):

    def sort_on_first_k_rows(x, k):
        # normalize each row so that its max value is 1
        a = (x[:k,:]/x[:k,:,None].max(1)).astype('float64')
        # multiply each row by the seq 10^n, for n=k-1,k-2...0
        # Ensures that the contribution of each row in the sorting is
        # captured in the final sum
        a_pow = (a*10**np.arange(a.shape[0]-1,-1,-1)[:,None])
        # Sort with the argsort on the resulting sum
        return x[:,a_pow.sum(0).argsort()]
    

    检查共享示例:

    sort_on_first_k_rows(A, 2)
    array([[2, 2, 9],
           [5, 6, 4],
           [0, 5, 7]])
    

    或者用另一个例子:

    A=np.array([[9, 2, 2, 1, 5, 2, 9],
                [4, 7, 6, 0, 9, 3, 3],
                [7, 0, 5, 0, 2, 1, 2]])
    
    sort_on_first_k_rows(A, 2)
    array([[1, 2, 2, 2, 5, 9, 9],
           [0, 3, 6, 7, 9, 3, 4],
           [0, 1, 5, 0, 2, 2, 7]])
    

    【讨论】:

      【解决方案2】:

      pandas 库对DataFrames 的排序非常灵活 - 但仅基于列。所以我建议像这样转置并将你的数组转换为DataFrame(注意你需要指定列名以便以后定义排序标准):

      df = pd.DataFrame(A.transpose(), columns=['col'+str(i) for i in range(len(A))])
      

      然后像这样排序并转换回来:

      A_new = df.sort_values(['col0', 'col1'], ascending=[True, True]).to_numpy().transpose()
      

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 2021-03-30
        相关资源
        最近更新 更多