一個numpy的陣列我有我所用numpy.array製作成一個數組列表有點像一臺
[[0, 3], [5, 1], [2, 1], [4, 5]]
:
[[0 3]
[5 1]
[2 1]
[4 5]]
如何解決這就像一個表?特別是,我想按升序對第二列進行排序,然後通過將第一列按升序排序來解決任何關係。因此,我希望:
[[2 1]
[5 1]
[0 3]
[4 5]]
任何幫助將不勝感激!
一個numpy的陣列我有我所用numpy.array製作成一個數組列表有點像一臺
[[0, 3], [5, 1], [2, 1], [4, 5]]
:
[[0 3]
[5 1]
[2 1]
[4 5]]
如何解決這就像一個表?特別是,我想按升序對第二列進行排序,然後通過將第一列按升序排序來解決任何關係。因此,我希望:
[[2 1]
[5 1]
[0 3]
[4 5]]
任何幫助將不勝感激!
見http://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html#numpy.lexsort你的情況
具體來說,
import numpy as np
x = np.array([[0,3],[5,1],[2,1],[4,5]])
x[np.lexsort((x[:,0],x[:,1]))]
輸出
array([[2,1],[5,1],[0,3],[4,5]])
您可以使用numpy.lexsort()
:
>>> a = numpy.array([[0, 3], [5, 1], [2, 1], [4, 5]])
>>> a[numpy.lexsort(a.T)]
array([[2, 1],
[5, 1],
[0, 3],
[4, 5]])
一這樣做的反璞歸真方式 - 切出你想要的數據的比特,使用argsort得到的排序指標,然後使用這個結果切片原來的數組:
a = np.array([[0, 3], [5, 1], [2, 1], [4, 5]])
subarray = a[:,1] # 3,1,1,5
indices = np.argsort(subarray) # Returns array([1,2,0,3])
result = a[indices]
或者,所有一氣呵成:
a[np.argsort(a[:,1])]
如果你想使用僅限於單列(例如,第二列),你可以這樣做排序:
from operator import itemgetter
a = [[0, 3], [5, 1], [2, 1], [4, 5]]
a_sorted = sorted(a, key=itemgetter(1))
如果有不止一個鍵,然後用numpy.lexsort()正如第四節所指出的那樣其他答案。
謝謝,對於我的情況'numpy.array(sorted(a,key = itemgetter(1)))'完美地工作仍然是最可讀的選項。 – firegurafiku
嗨,感謝您的解決方案。我最喜歡這個,因爲它告訴我用x [:: - 1,0]替換x [:,0],我可以顛倒第二個排序方向(第一列)。非常感謝所有! – Derek