问题
我试图计算字符串列表的频率,并按降序排序。scipy.stats.itemfreq生成频率结果,这些结果作为字符串元素的numpy数组输出。这就是我困惑的地方。我该怎么分类?
到目前为止,我已经尝试过operator.itemgetter,它似乎适用于一个小列表,直到我意识到它是按照第一个字符串字符排序,而不是将字符串转换为整数,所以是'5' > '11',因为它在比较5和1,而不是5和11。
我使用python2.7,numpy 1.8.1,ciply0.14.0。
示例代码:
from scipy.stats import itemfreq
import operator as op
items = ['platypus duck','platypus duck','platypus duck','platypus duck','cat','dog','platypus duck','elephant','cat','cat','dog','bird','','','cat','dog','bird','cat','cat','cat','cat','cat','cat','cat']
items = itemfreq(items)
items = sorted(items, key=op.itemgetter(1), reverse=True)
print items
print items[0]输出:
[array(['platypus duck', '5'],
dtype='|S13'), array(['dog', '3'],
dtype='|S13'), array(['', '2'],
dtype='|S13'), array(['bird', '2'],
dtype='|S13'), array(['cat', '11'],
dtype='|S13'), array(['elephant', '1'],
dtype='|S13')]
['platypus duck' '5']预期输出:
我在点餐,所以就像:
[array(['cat', '11'],
dtype='|S13'), array(['platypus duck', '5'],
dtype='|S13'), array(['dog', '3'],
dtype='|S13'), array(['', '2'],
dtype='|S13'), array(['bird', '2'],
dtype='|S13'), array(['elephant', '1'],
dtype='|S13')]
['cat', '11']摘要
我的问题是:如何按计数的降序排序数组(在本例中是字符串数组)?请随时向我上面的代码示例建议其他更快/改进的方法。
发布于 2015-07-06 19:56:50
不幸的是,itemfreq返回相同数组中的唯一项及其计数。对于您的情况,这意味着计数被转换为字符串,这只是一个哑巴。
如果您可以将numpy升级到版本1.9,那么可以使用itemfreq,而不是使用numpy.unique和参数return_counts=True (关于如何在旧的numpy中实现这一点,请参阅下面的内容):
In [29]: items = ['platypus duck','platypus duck','platypus duck','platypus duck','cat','dog','platypus duck','elephant','cat','cat','dog','bird','','','cat','dog','bird','cat','cat','cat','cat','cat','cat','cat']
In [30]: values, counts = np.unique(items, return_counts=True)
In [31]: values
Out[31]:
array(['', 'bird', 'cat', 'dog', 'elephant', 'platypus duck'],
dtype='|S13')
In [32]: counts
Out[32]: array([ 2, 2, 11, 3, 1, 5])获取将counts按递减顺序排列的索引:
In [38]: idx = np.argsort(counts)[::-1]
In [39]: values[idx]
Out[39]:
array(['cat', 'platypus duck', 'dog', 'bird', '', 'elephant'],
dtype='|S13')
In [40]: counts[idx]
Out[40]: array([11, 5, 3, 2, 2, 1])对于较早版本的numpy,可以组合np.unique和np.bincount,如下所示:
In [46]: values, inv = np.unique(items, return_inverse=True)
In [47]: counts = np.bincount(inv)
In [48]: values
Out[48]:
array(['', 'bird', 'cat', 'dog', 'elephant', 'platypus duck'],
dtype='|S13')
In [49]: counts
Out[49]: array([ 2, 2, 11, 3, 1, 5])
In [50]: idx = np.argsort(counts)[::-1]
In [51]: values[idx]
Out[51]:
array(['cat', 'platypus duck', 'dog', 'bird', '', 'elephant'],
dtype='|S13')
In [52]: counts[idx]
Out[52]: array([11, 5, 3, 2, 2, 1])事实上,上述正是itemfreq所做的。下面是itemfreq在the源代码中的定义(没有docstring):
def itemfreq(a):
items, inv = np.unique(a, return_inverse=True)
freq = np.bincount(inv)
return np.array([items, freq]).T发布于 2018-09-24 10:22:46
完成任务的一个简单得多的方法是使用熊猫函数value_counts (原始帖子和更多建议见here):获取项目的频率并按频率排序项目:
import pandas as pd
import numpy as np
x = np.array(["bird","cat","dog","dog","cat","cat"])
pd.value_counts(x)
cat 3
dog 2
bird 1
dtype: int64只得到发生的次数,排序:
y = pd.value_counts(x).values
array([3, 2, 1])只获取要计数的项的唯一名称,排序如下:
z = pd.value_counts(x).index
Index(['cat', 'dog', 'bird'], dtype='object')https://stackoverflow.com/questions/31254392
复制相似问题