按唯一出现顺序记录数组

时间:2013-07-02 02:18:19

标签: python numpy

我很难拼凑一些逻辑来按唯一出现顺序排列一个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.uniquenp.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时失去的地方。

1 个答案:

答案 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')])

我可能需要在早上仔细检查一下,以确保其稳定。