首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序包含字符串的scipy.stats.itemfreq结果

排序包含字符串的scipy.stats.itemfreq结果
EN

Stack Overflow用户
提问于 2015-07-06 19:47:59
回答 2查看 1K关注 0票数 0

问题

我试图计算字符串列表的频率,并按降序排序。scipy.stats.itemfreq生成频率结果,这些结果作为字符串元素的numpy数组输出。这就是我困惑的地方。我该怎么分类?

到目前为止,我已经尝试过operator.itemgetter,它似乎适用于一个小列表,直到我意识到它是按照第一个字符串字符排序,而不是将字符串转换为整数,所以是'5' > '11',因为它在比较51,而不是511

我使用python2.7,numpy 1.8.1,ciply0.14.0。

示例代码:

代码语言:javascript
复制
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]

输出:

代码语言:javascript
复制
[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']

预期输出:

我在点餐,所以就像:

代码语言:javascript
复制
[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']

摘要

我的问题是:如何按计数的降序排序数组(在本例中是字符串数组)?请随时向我上面的代码示例建议其他更快/改进的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-06 19:56:50

不幸的是,itemfreq返回相同数组中的唯一项及其计数。对于您的情况,这意味着计数被转换为字符串,这只是一个哑巴。

如果您可以将numpy升级到版本1.9,那么可以使用itemfreq,而不是使用numpy.unique和参数return_counts=True (关于如何在旧的numpy中实现这一点,请参阅下面的内容):

代码语言:javascript
复制
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按递减顺序排列的索引:

代码语言:javascript
复制
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.uniquenp.bincount,如下所示:

代码语言:javascript
复制
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):

代码语言:javascript
复制
def itemfreq(a):
    items, inv = np.unique(a, return_inverse=True)
    freq = np.bincount(inv)
    return np.array([items, freq]).T
票数 2
EN

Stack Overflow用户

发布于 2018-09-24 10:22:46

完成任务的一个简单得多的方法是使用熊猫函数value_counts (原始帖子和更多建议见here):获取项目的频率并按频率排序项目:

代码语言:javascript
复制
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

只得到发生的次数,排序:

代码语言:javascript
复制
y = pd.value_counts(x).values

array([3, 2, 1])

只获取要计数的项的唯一名称,排序如下:

代码语言:javascript
复制
z = pd.value_counts(x).index

Index(['cat', 'dog', 'bird'], dtype='object')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31254392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档