2013-07-02 76 views
1

我有困難的拼湊一些邏輯命令通過獨特的出現,使得第一記錄最常發生和去年一樣頻繁的至少一個numpy的記錄陣列。訂單記錄陣列

考慮四個記錄有一個重複:

import numpy as np 
ar = np.array([('A', 1), ('B', 3), ('A', 2), ('B', 3)], 
       dtype=[('c1', '|S1'), ('c2', 'i')]) 

我理想的結果是這樣的:

[('B', 3) ('A', 1) ('A', 2)] 

(對於SQL球迷:SELECT c1, c2 FROM ar GROUP BY c1, c2 ORDER BY count(*) DESC;

這是我嘗試使用np.unique and np.bincount

uar, inv = np.unique(ar, return_inverse=True) 
print uar # [('A', 1) ('A', 2) ('B', 3)] 
print inv # [0 2 1 2] 
print np.bincount(inv) # [1 1 2] 

但是這是我在拼湊togher任何邏輯迷路根據從np.bincount遞減計數排序uar

回答

1
>>> uar[np.bincount(inv).argsort()[::-1]] 
array([('B', 3), ('A', 2), ('A', 1)], 
     dtype=[('c1', '|S1'), ('c2', '<i4')]) 

Argsort會發現排序從最低到最高的指數:

>>> np.bincount(inv).argsort() 
array([0, 1, 2]) 
>>> np.bincount(inv).argsort()[::-1] #Reverse. 
array([2, 1, 0]) 

您可以使用lexsort增加分揀的控制:

uar[np.lexsort((uar['c2'],np.bincount(inv)*-1))] 
array([('B', 3), ('A', 1), ('A', 2)], 
     dtype=[('c1', '|S1'), ('c2', '<i4')]) 

我可能需要仔細檢查這個早上,以確保其穩定。

+0

點上;與更復雜的現實世界的情況下完美地工作 –