2017-02-07 18 views
2

countmapは、リスト内の項目の数を照合することができますJuliaでcountmapとproportionmapを組み合わせる方法は?

import StatsBase: countmap, proportionmap, addcounts! 
a = [1,2,3,4,1,2,2,3,1,2,5,7,4,8,4] 
b = [1,2,5,3,1,6,1,6,1,2,6,2] 
x, y = countmap(a), countmap(b) 

を[出力]:

(Dict(7=>1,4=>3,2=>4,3=>2,5=>1,8=>1,1=>3),Dict(2=>3,3=>1,5=>1,6=>3,1=>4)) 

私のようなcountmap辞書に生のリストからカウントを追加することができます。

z = addcounts!(x, b) 

[out]:

Dict{Int64,Int64} with 8 entries: 
    7 => 1 
    4 => 3 
    2 => 7 
    3 => 3 
    5 => 2 
    8 => 1 
    6 => 3 
    1 => 7 

しかし、どういうわけか、私はすでに数え辞書を持っている場合、私はちょうどそれらを追加できませんでした:

addcounts!(x, y) 

[エラー]:

MethodError: no method matching addcounts!(::Dict{Int64,Int64}, ::Dict{Int64,Int64}) 
Closest candidates are: 
    addcounts!{T}(::Dict{T,V}, ::AbstractArray{T,N}) at /Users/liling.tan/.julia/v0.5/StatsBase/src/counts.jl:230 
    addcounts!{T,W}(::Dict{T,V}, ::AbstractArray{T,N}, ::StatsBase.WeightVec{W,Vec<:AbstractArray{T<:Real,1}}) at /Users/liling.tan/.julia/v0.5/StatsBase/src/counts.jl:237 

どちらもあまりにもこの仕事をした:

x + y 

[エラー]:

MethodError: no method matching +(::Dict{Int64,Int64}, ::Dict{Int64,Int64}) 
Closest candidates are: 
    +(::Any, ::Any, ::Any, ::Any...) at operators.jl:138 

countmapを複数組み合わせる方法はありますか?

など。 Pythonで:

>>> from collections import Counter 
>>> a = [1,2,3,4,1,2,2,3,1,2,5,7,4,8,4] 
>>> b = [1,2,5,3,1,6,1,6,1,2,6,2] 
>>> x, y = Counter(a), Counter(b) 
>>> z = x + y 
>>> z 
Counter({1: 7, 2: 7, 3: 3, 4: 3, 6: 3, 5: 2, 7: 1, 8: 1}) 

答えて

1

Jun Zhangは、DataStructures.jlがAccumulatorタイプ(a.k.aカウンタ)を提供することを提案しました。具体的には、問題の結果を得るために:

using DataStructures 

x,y = counter(a),counter(b) 

push!(x,y)   # push! replaces addcounts! 

x containts xyの合計。

+0

xは累積されてもyは同じままですか? – alvas

+1

確かに。 'x'はDictではありませんが、そのようにアクセスできます。詳細については、http://datastructuresjl.readthedocs.io/ja/latest/accumulators.htmlにあるドキュメントを参照してください。 –

+0

ありがとう@DanGetz! – alvas

1

基本的に問題は2つの辞書を合計することです。 Julia標準ライブラリはそのような機能を提供しています。

DataStructures.jlを試すことができます。 merge()関数は、Pythonでのカウンタの追加とほぼ同じです。このためにパッケージ全体が必要ない場合は、手で行うのは難しいことではありません。

+0

これは 'proportionmap'でも面倒です; P – alvas

+1

まあ、私は、あなたが2つの' proportionmap'しか持っていないと、それらを "結合する"という些細な方法がないと思います。少なくとも、両方の配列のサイズを知る必要があります。 –

関連する問題