我很难拼凑一些逻辑来按唯一的出现次数对 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]
但这就是我迷失在拼凑任何逻辑以根据 np.bincount
的递减计数对 uar
进行排序的地方。
最佳答案
>>> 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')])
我可能需要在早上仔细检查一下以确保其稳定。
关于python - 按唯一出现次数对记录数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416418/