簡體   English   中英

按前 n 行對二維數組進行排序

[英]Sorting 2D array by the first n rows

如何按前兩行對 NumPy 中的數組進行排序?

例如,

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

我想按前兩行對列進行排序,這樣我就回來了:

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

謝謝!

一種方法是將我們想要對其進行argsort的 2D 數組轉換為更易於處理的 1D 數組。 為此,一個想法可能是將行相乘以考慮排序目的,方法是通過以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]])

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM