我很难拼凑一些逻辑来按唯一出现顺序排列一个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
和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]
但是根据uar
的减少计数,这就是我在拼凑任何逻辑以排序np.bincount
时失去的地方。
答案 0 :(得分: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')])
我可能需要在早上仔细检查一下,以确保其稳定。