我有一個包含重複值和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。
我有一個包含重複值和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。
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])")
。但是我不能通過值來訪問數組值,例如(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
剛編輯按值訪問 –
這工作,並且非常優雅。但它多次傳遞數組'y'。如果你在'y'中有許多獨特的值,它會變得難以忍受,很容易慢幾個數量級。 'countmap'避免了這個問題。 – DNF
要卸下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
值。
使用y-> y進行過濾!= NaN'不起作用,因爲NaN!= NaN是真的(按照IEEE浮點算法的規則)。相反,你可以用'y - >!isnan(y)'過濾。 –
@JeffBezanson好的,謝謝!我在回覆中糾正了它。它的工作原理是 –
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
另請參閱http://stackoverflow.com/questions/21172027/count-instances-of-each-unique-integer-in-a-vector-in-1-line-of-code –