Julia 对计数器进行排序(并提取最常见的值)
提供了一组很棒的工具,其中一个是。相应的Python对象,Julia 对计数器进行排序(并提取最常见的值),julia,Julia,提供了一组很棒的工具,其中一个是。相应的Python对象,Counter提供了一个最常用的方法。这将如何在Julia中实现?可以通过选择来完成繁重的工作。以下内容应重现Python中最常见的行为: using DataStructures most_common(c::Accumulator) = most_common(c, length(c)) most_common(c::Accumulator, k) = select!(collect(c), 1:k, by=kv->kv
Counter
提供了一个最常用的方法。这将如何在Julia中实现?可以通过选择来完成繁重的工作代码>。以下内容应重现Python中最常见的行为:
using DataStructures
most_common(c::Accumulator) = most_common(c, length(c))
most_common(c::Accumulator, k) = select!(collect(c), 1:k, by=kv->kv[2], rev=true)
在Julia获得专门化函数参数by=kv->kv[2]
(这是计划中的)的能力之前,性能将受到影响;在对returns视图(这也是计划中的)进行索引之前,它将执行不必要的复制以创建正确长度的输出向量。但只要它不是性能关键型的,上述功能就可以正常工作
当然,性能问题可以通过更仔细、低级别的实现来处理。我不知道有没有用于此的现有函数,但它可能是DataStructures.jl或Julia本身值得添加的。这对于不是计数器或累加器的关联集合也是有意义的,但可能应该命名为其他名称。要更新此问题,我使用的是Julia v1.2.1,没有选择代码>afaik
下面是对我使用的@Toivo实现的一个轻微修改:
using DataStructures
most_common(c::Accumulator) = most_common(c, length(c))
most_common(c::Accumulator, k) = sort(collect(c), by=kv->kv[2], rev=true)[1:k]
这将返回一个::数组{Pair{String,Int}},1
,具有k
成员,类似于Python计数器。最常见的(k)
,它返回一个最大为k
的元组对列表
示例:
使用PythonCounter
和JuliaDataStructures.Counter查找《哈姆雷特》中最常见的十个单词
Python:
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
朱莉娅:
> import DataStructures: counter
> open("hamlet.txt") do f
> words = matchall(r"\w+", read(f, String))
> counter(words)|> most_common
> end
10-element Array{Pair{Any,Int64},1}:
"the" => 1143
"and" => 966
"to" => 762
...
我没有足够的经验来评论效率,但我很想听听专家们的意见