2016-08-23 135 views
1

我有一個包含重複值和NaN值的2500個值的向量。我想刪除所有NaN值並計算每個其他值的出現次數。向量中元素的出現次數[JULIA]

y 
2500-element Array{Int64,1}: 
8 
43 
NaN 
46 
NaN 
8 
8 
3 
46 
NaN 

例如: 8 OCCURENCES的數目是3 46 OCCURENCES的數目是2 43 OCCURENCES的數目是1。

+0

另請參閱http://stackoverflow.com/questions/21172027/count-instances-of-each-unique-integer-in-a-vector-in-1-line-of-code –

回答

3
y=rand(1:10,20) 
u=unique(y) 
d=Dict([(i,count(x->x==i,y)) for i in u]) 
println("count for 10 is $(d[10])") 
+0

。但是我不能通過值來訪問數組值,例如(6,1)我怎樣才能只讀取1?。我需要繪製直方圖。 x軸表示不同的值,y軸表示每個值的出現次數。[(i,count(x-> x == i,y))in i] 9-element Array {Tuple {任何,Int64類型},1}: (6,1) (1,2) (7,3) (10,3) (9,3) (2,3) (5,1 ) (3,2) (8,2) – vincet

+0

剛編輯按值訪問 –

+1

這工作,並且非常優雅。但它多次傳遞數組'y'。如果你在'y'中有許多獨特的值,它會變得難以忍受,很容易慢幾個數量級。 'countmap'避免了這個問題。 – DNF

6

要卸下NaN值可以使用過濾功能。從朱莉婭文檔:

過濾器(功能,集合)

返回集合的一個副本,刪除元素,其功能是假的。

x = filter(y->!isnan(y),y) 
filter!(y->!isnan(y),y) 

因此,我們創建作爲我們的函數的條件!isnan(y),並用它來過濾陣列y(注意,我們也可以選擇使用z或我們選擇任何其他變量書面,因爲第一個參數filter只是定義了一個內聯函數)。請注意,我們可以再這個保存爲一個新的對象,或使用替代版本的修改,以簡單地修改現有對象y

然後,之前或之後此,取決於我們是否要由!信號要包括我們的計數中的NaN,我們可以使用StatsBase中的countmap()函數。從朱莉婭文檔:

countmap(x)的

返回一個字典映射x到其號碼的 出現的每個唯一值。

using StatsBase 
a = countmap(y) 

然後可以訪問此字典,例如特定元素a[-1]會告訴你多少次也有-1

或者,如果你想然後再轉換字典數組,你可以使用:

b = hcat([[key, val] for (key, val) in a]...)' 

注:由於@JeffBezanon對正確的意見方法用於過濾NaN值。

+0

使用y-> y進行過濾!= NaN'不起作用,因爲NaN!= NaN是真的(按照IEEE浮點算法的規則)。相反,你可以用'y - >!isnan(y)'過濾。 –

+1

@JeffBezanson好的,謝謝!我在回覆中糾正了它。它的工作原理是 –

2

countmap是迄今爲止我見過的最好的解決辦法,但這裏有一個寫出來的版本,這是唯一稍微慢一些。它只有通過在陣列上一次,所以如果你有許多獨特的價值,這是非常有效:

function countmemb1(y) 
    d = Dict{Int, Int}() 
    for val in y 
     if isnan(val) 
      continue 
     end 
     if val in keys(d) 
      d[val] += 1 
     else 
      d[val] = 1 
     end 
    end 
    return d 
end 

在接受答案的解決方案可以更快一點,如果有獨特價值的一個非常小的數字,但其他方面的規模很小。

編輯:因爲我無法獨自離開不夠好,這裏有一個版本是更通用的也快(countmap不接受字符串,集或元組爲例):

function countmemb(itr) 
    d = Dict{eltype(itr), Int}() 
    for val in itr 
     if isa(val, Number) && isnan(val) 
      continue 
     end 
     d[val] = get!(d, val, 0) + 1 
    end 
    return d 
end 
相關問題