2017-03-09 51 views
0

需要一些關於此的想法。我確信有一個聰明的pythonic方法來做到這一點,而不是訴諸陣列的'單元格'重建。根據內容重新排列numpy數組中的列(具體值的計數)

背景: 我試圖操縱我們用來整理衆包工作者判斷的系統中的一個大型摘要。我正在格式化數據,因此它採用合適的格式來推送OpenBugs以及可能後來的PyMC。

我有以下格式的大型np數組,有多達500列和許多1000行。這是簡化的示例:

a = np.array([['a','b','c','d','e'], 
      [1, 2, 3, 4, 5], 
      [1, 2, 'na', 'na','na'], 
      [1, 2, 'na', 4, 5]]) 

所需的結果:我要重新排序(理想地就地)中的數據,使得它們通過其出現在列的'na'數進行排序的列。 NB我不要想排序一個上校。而是自己對列進行排序。

我想要一個選項來指定有多少主導列獨立(不移動),因爲這取決於時間。並按升序/降序排序。最上面一行是一個標題,誰的值指向列。所有的值都是int或'na',而頭是一個字符串。

所以在這個例子中。如果我想的'na降號碼留在原地'a'關口,並排序輸出將是:

a = np.array([['a','c','d','e','b'], 
       [1, 3, 4, 5, 2], 
       [1, 'na', 'na', 'na',2], 
       [1, 'na', 4, 5, 2]]) 

任何聰明的數組操作建議表示歡迎!

+0

發佈的解決方案是否適合您? – Divakar

回答

0

一種方法是 -

N = 1 # No. of leading cols to be kept 
out = a[:,np.r_[:N,(-(a[:,N:]=='na').sum(0)).argsort()+N]] 

基本上,我們N後選擇所有列,對'na'比較並獲得每列的計數與.sum(0)以降序越來越argsort指數。最後,我們將一系列指數上升到N與這些argsort指數並索引到輸入數組的列中,以給我們所需的輸出。

樣品試驗 -

In [89]: a 
Out[89]: 
array([['a', 'b', 'c', 'd', 'e'], 
     ['1', '2', '3', '4', '5'], 
     ['1', '2', 'na', 'na', 'na'], 
     ['1', '2', 'na', '4', '5']], 
     dtype='|S2') 

In [90]: N = 1 # No. of leading cols to be kept 

In [91]: a[:,np.r_[:N,(-(a[:,N:]=='na').sum(0)).argsort()+N]] 
Out[91]: 
array([['a', 'c', 'd', 'e', 'b'], 
     ['1', '3', '4', '5', '2'], 
     ['1', 'na', 'na', 'na', '2'], 
     ['1', 'na', '4', '5', '2']], 
     dtype='|S2') 

In [92]: N = 2 # No. of leading cols to be kept 

In [93]: a[:,np.r_[:N,(-(a[:,N:]=='na').sum(0)).argsort()+N]] 
Out[93]: 
array([['a', 'b', 'c', 'd', 'e'], 
     ['1', '2', '3', '4', '5'], 
     ['1', '2', 'na', 'na', 'na'], 
     ['1', '2', 'na', '4', '5']], 
     dtype='|S2') 

如果有'na'等於數沒關係,更高性能的解決辦法是避免輸入數組的negation用於獲取列的順序通過,而不是反轉降序argsort索引沒有否定,像這樣 -

a[:,np.r_[:N,(a[:,N:]=='na').sum(0).argsort()[::-1]+N]]