2017-10-29 182 views
-2

我有一個numpy的陣列看起來像這樣:如何根據列值對numpy數組進行排序?

>>> array_text[:10] 
array([[1, 52.51, 12, 0], 
    [1, 52.52, 52, 2], 
    [1, 52.53, 1, 6], 
    [2, 52.51, 20, 0], 
    [2, 52.52, 75, 76], 
    [2, 52.53, 6, 33], 
    [3, 52.51, 84, 0], 
    [3, 52.52, 39, 68], 
    [3, 52.53, 0, 13], 
    [4, 52.51, 1, 0]], dtype=object) 

我想要做的就是按照其第二列排序,按降序排列。所以我想要的結果是:

>>> array_text[:10] 
array([[1, 52.53, 1, 6], 
    [1, 52.52, 52, 2], 
    [1, 52.51, 12, 0], 
    [2, 52.53, 6, 33], 
    [2, 52.52, 75, 76], 
    [2, 52.51, 20, 0], 
    [3, 52.53, 0, 13], 
    [3, 52.52, 39, 68], 
    [3, 52.51, 84, 0], 
    [4, 52.51, 1, 0]], dtype=object) 

我該怎麼做?

+0

你的意思是,保持在排序在第一個的每個值下降在第二列順序的第一列和升序? – James

+0

@詹姆斯是的!那就是我的意思。 – maynull

回答

2

您可以使用numpy.lexsort。顛倒列的技巧是通過乘以-1來實現的。

import numpy as np 
arr[np.lexsort((-1*arr[:,1], arr[:,0]))] 

輸出繼電器:

array([[1, 52.53, 1, 6], 
     [1, 52.52, 52, 2], 
     [1, 52.51, 12, 0], 
     [2, 52.53, 6, 33], 
     [2, 52.52, 75, 76], 
     [2, 52.51, 20, 0], 
     [3, 52.53, 0, 13], 
     [3, 52.52, 39, 68], 
     [3, 52.51, 84, 0], 
     [4, 52.51, 1, 0]], dtype=object) 
+0

非常感謝您的幫助!我從中學到了很多東西! – maynull

+0

@maynull - 不客氣 – Transhuman

0

處理此問題的最簡單方法是使用熊貓,因爲已使用sort_values方法將功能內置到數據框中。

import pandas as pd 
import numpy as np 

x = np.array([[1, 52.51, 12, 0], 
       [1, 52.52, 52, 2], 
       [1, 52.53, 1, 6], 
       [2, 52.51, 20, 0], 
       [2, 52.52, 75, 76], 
       [2, 52.53, 6, 33], 
       [3, 52.51, 84, 0], 
       [3, 52.52, 39, 68], 
       [3, 52.53, 0, 13], 
       [4, 52.51, 1, 0]], dtype=object) 

df = pd.DataFrame(x, columns=list('ABCD')) 
df.sort_values(['A', 'B'], ascending=[True, False]).values 
# returns: 
array([[1, 52.53, 1, 6], 
     [1, 52.52, 52, 2], 
     [1, 52.51, 12, 0], 
     [2, 52.53, 6, 33], 
     [2, 52.52, 75, 76], 
     [2, 52.51, 20, 0], 
     [3, 52.53, 0, 13], 
     [3, 52.52, 39, 68], 
     [3, 52.51, 84, 0], 
     [4, 52.51, 1, 0]], dtype=object) 
+0

非常感謝您的幫助!我從數據框中創建數組,所以你的答案也是非常有用的!這是一個恥辱,我可以選擇只有一個有用的答案! – maynull

相關問題