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.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.

4

1 回答 1

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

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

于 2013-07-02T03:15:15.867 回答