python - 按唯一出现次数对记录数组进行排序

标签 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.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/

相关文章:

python - x 和 y 数组点的笛卡尔积转化为单个二维点数组

python - Tensorflow GPU安装库与CPU安装库的区别

python - 将列表的元素添加到某些列中的所有元素

numpy - 两台计算机上相同的numpy均值计算结果不同

python - argparse - 为什么代码在没有被调用的情况下被执行?

python - 标量的奇怪 numpy 划分行为

Python:如果我知道原始像素的位置,如何找到所有连接的像素?

python - 如何在 cython 的结构中使用文件指针

python - 在 VSCode 中运行任何 Python 脚本时出现 & "&"语法错误?

python - 从Python中的字符串中删除第一组字符