簡體   English   中英

用numpy排序數組

[英]Sorting array with numpy

我想改變列元素的順序

a = np.asarray(
[[0,1,1,2,2,2,2,3,3,3,4,4,4,4,4,4],
 [4,0,3,0,1,2,5,1,2,5,3,4,6,6,7,7],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,1,0,0,0,1,1,0,1,0,1]]
)

基於第1-3行的值(基於0)。 我的解決方案目前如下所示:

a[:, a.transpose()[:, 1].argsort(axis=0)]

array([[1, 2, 2, 3, 2, 3, 1, 4, 0, 4, 2, 3, 4, 4, 4, 4],
       [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1]])

這很好,除了我還想在搜索中包含2-3行(按字典順序)。 理想情況下,我希望最后一行是[0, 1, 0, 1, ..., 0, 1] (第二行充滿零也應該考慮在內,但在這個例子中它包含相同的值)。

你需要numpy.lexsort ,它相當於argsort但基於多個排序鍵; 給定多個數組,它返回索引以按順序對數組進行排序:

給定多個排序鍵(可以解釋為電子表格中的列),lexsort返回一個整數索引數組,用於按多列描述排序順序。 序列中的最后一個鍵用於主要排序順序,倒數第二個鍵用於輔助排序順序,依此類推。 keys參數必須是可以轉換為相同形狀的數組的一系列對象。 如果為keys參數提供了2D數組,則將其行解釋為排序鍵,並根據最后一行,第二行等排序。

a[:, np.lexsort(a[:0:-1])]
#array([[2, 1, 3, 2, 3, 2, 1, 4, 0, 4, 3, 2, 4, 4, 4, 4],
#       [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7],
#       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])

暫無
暫無

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

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