2014-11-03 24 views
1

我想按照其第一列數的順序對numpy矩陣進行排序(命令必須移動此列的每個元素的所有行) ,我嘗試使用「argsort()」命令,但當數字大於9時,它不起作用,因爲它僅適用於每個元素的第一個數字,例如對於以下numpy矩陣:按特定列(使用2位或更多數字)對矩陣進行排序

1.1 ....... ........ ....... 
1.2 ....... ........ ....... 
1.3 ....... ........ ....... 
2.1 ....... ........ ....... 
2.2 ....... ........ ....... 
2.3 ....... ........ ....... 
3.1 ....... ........ ....... 
3.2 ....... ........ ....... 
3.3 ....... ........ ....... 
6.1 ....... ........ ....... 
6.2 ....... ........ ....... 
6.3 ....... ........ ....... 
8.1 ....... ........ ....... 
8.2 ....... ........ ....... 
8.3 ....... ........ ....... 
5.1 ....... ........ ....... 
5.2 ....... ........ ....... 
5.3 ....... ........ ....... 
4.1 ....... ........ ....... 
4.2 ....... ........ ....... 
4.3 ....... ........ ....... 
12.1 ....... ........ ....... 
12.2 ....... ........ ....... 
12.3 ....... ........ ....... 
11.1 ....... ........ ....... 
11.2 ....... ........ ....... 
11.3 ....... ........ ....... 
10.1 ....... ........ ....... 
10.2 ....... ........ ....... 
10.3 ....... ........ ....... 
9.1 ....... ........ ....... 
9.2 ....... ........ ....... 
9.3 ....... ........ ....... 
7.1 ....... ........ ....... 
7.2 ....... ........ ....... 

cjarray.sort=cjarray[cjarray[:, 0].argsort()] 

1.1 ....... ........ ....... 
1.2 ....... ........ ....... 
1.3 ....... ........ ....... 
10.1 ....... ........ ....... 
10.2 ....... ........ ....... 
10.3 ....... ........ ....... 
11.1 ....... ........ ....... 
11.2 ....... ........ ....... 
11.3 ....... ........ ....... 
12.1 ....... ........ ....... 
12.2 ....... ........ ....... 
12.3 ....... ........ ....... 
2.1 ....... ........ ....... 
2.2 ....... ........ ....... 
2.3 ....... ........ ....... 
3.1 ....... ........ ....... 
3.2 ....... ........ ....... 
3.3 ....... ........ ....... 
4.1 ....... ........ ....... 
4.2 ....... ........ ....... 
4.3 ....... ........ ....... 
5.1 ....... ........ ....... 
5.2 ....... ........ ....... 
5.3 ....... ........ ....... 
6.1 ....... ........ ....... 
6.2 ....... ........ ....... 
6.3 ....... ........ ....... 
7.1 ....... ........ ....... 
7.2 ....... ........ ....... 
7.3 ....... ........ ....... 
8.1 ....... ........ ....... 
8.2 ....... ........ ....... 
8.3 ....... ........ ....... 
9.1 ....... ........ ....... 
9.2 ....... ........ ....... 

正如你所看到的,矩陣從1.3跳轉到10.1,因爲該命令只關心第一位數字,可以有人給出答案。

非常感謝!

+2

歡迎來到StackOverflow。希望有人會一起回答你的問題。雖然不錯,但您可以通過將示例輸出的大小減小到顯示問題所需的最小數量,併發布您使用的代碼,讓我們更好地瞭解您嘗試的內容,以及起點改變的建議。 – GreenAsJade 2014-11-03 04:09:44

+1

你能打印矩陣的dtype嗎?我認爲這是str? – HYRY 2014-11-03 04:12:07

回答

1

你應該argsort()僅沿要排序矩陣和列使用生成指數排序矩陣。演示:

>>> a=np.array([[12,2,3,4],[22,1,3,5],[4,1,6,7],[15,1,2,7]]) 
>>> a 
array([[12, 2, 3, 4], 
     [22, 1, 3, 5], 
     [ 4, 1, 6, 7], 
     [15, 1, 2, 7]]) 
>>> a[a[:,0].argsort()] 
array([[ 4, 1, 6, 7], 
     [12, 2, 3, 4], 
     [15, 1, 2, 7], 
     [22, 1, 3, 5]]) 
+0

嗨,謝謝你的回答!我使用了相同的結構:cjarraysort = cjarray [cjarray [:, 0] .argsort()],但不起作用,它將我帶到上面。 – Chuz 2014-11-04 00:55:32

+0

我認爲要麼你使用** numpy矩陣**,要麼你在矩陣中有**字符串**值。因此,首先使用'cjarray = np.array(cjarray,dtype = float)'轉換您的矩陣,然後再次嘗試相同的代碼。我希望這能幫到您。 – 2014-11-04 05:29:57

+0

它是:>>> type(cjarray) 我有以下錯誤使用你的結構,Traceback(最近調用最後一個): 文件「C:\ Python27 \ borrar.py」 ,第35行,在 cjarray = np.array(cjarray,dtype = float) ValueError:無法將字符串轉換爲float:+ j -0.9383000267矩陣的第一列是上述原始問題的數字,另一列柱是複數的真實部分和想象部分。 – Chuz 2014-11-05 04:39:55

0

這是我用了很長時間模擬MATLAB sortrows。 Tbh .argsort似乎更吸引人,應該工作得很好。它幾年前還沒有提供。

def sortrows(data): 
    """assumes data to be numpy.ndarray""" 
    data = np.ascontinuousarray(data) 
    return np.sort(
     data.view(['', data.dtype] * data.shape[1]), axis=0 
    ).view(data.dtype) 
相關問題