按julia中的公共列值合并大量数组
扩展我之前提出的一个问题,假设我们有大量数组(比如500个数组),比如下面的3个第一个数组按julia中的公共列值合并大量数组,julia,array-merge,Julia,Array Merge,扩展我之前提出的一个问题,假设我们有大量数组(比如500个数组),比如下面的3个第一个数组 5.03.5 6.0 3.6 7.0 3.0 5.04.5 6.0 4.7 8.0 3.0 5.04.0 6.0 3.2 8.0 4.0 以此类推,存储在一个数组中,因此我们有一个包含500个以上类型数组的数组。我想通过第一列的公共值将500个数组合并成一个数组,计算第二列相应元素的平均值。结果必须是以下数组: 5.0所有5个值的平均值 6.0所有6个值的平均值 7.0所有7个值的平均值 8.0所有
5.03.5
6.0 3.6
7.0 3.0
5.04.5
6.0 4.7
8.0 3.0
5.04.0
6.0 3.2
8.0 4.0
以此类推,存储在一个数组中,因此我们有一个包含500个以上类型数组的数组。我想通过第一列的公共值将500个数组合并成一个数组,计算第二列相应元素的平均值。结果必须是以下数组:
5.0所有5个值的平均值
6.0所有6个值的平均值
7.0所有7个值的平均值
8.0所有8个值的平均值
我怎样才能做到这一点?谢谢大家! 也可以通过稍微修改
这是一个比@PicaudVincent(基于他的输入数据)的答案快约6倍的版本,但它没有对键进行排序,因此返回矩阵的行的顺序是任意的:
function accumarrays(A::Vector{Matrix{T}}) where {T}
d = Dict{T, Tuple{T, Int}}()
for a in A
for i in indices(a, 1)
ai = a[i, 1]
d[ai] = get(d, ai, (zero(T), 0)) .+ (a[i, 2], 1)
end
end
Aout = Matrix{typeof(one(T)/1)}(length(d), 2)
i = 0
for (key, val) in d
Aout[i+=1, 1] = key
Aout[i, 2] = val[1] / val[2]
end
return Aout
end
如果需要对行进行排序,则此操作有效,但速度仅为4-5倍:
function accumarrays_(A::Vector{Matrix{T}}) where {T}
d = Dict{T, Tuple{T, Int}}()
for a in A
for i in indices(a, 1)
ai = a[i, 1]
d[ai] = get(d, ai, (zero(T), 0)) .+ (a[i, 2], 1)
end
end
dkeys = sort!(collect(keys(d)))
Aout = Matrix{typeof(one(T)/1)}(length(dkeys), 2)
for i in eachindex(dkeys)
val = d[dkeys[i]]
Aout[i, 1] = dkeys[i]
Aout[i, 2] = val[1] / val[2]
end
return Aout
end
对我考虑了我上一篇文章的延期。非常感谢。非常感谢你!速度确实总是受欢迎的,这也是我一直在寻找的!如果我们想得到标准偏差呢?我试图用函数
std(…,corrected=false)
调整以d[ai]=get…
开头的行,但我无法获得标准偏差而不是平均值。即使对于平均值,难道不能使用mean
函数吗?那是行不通的。函数std
和意味着
必须处理数字集合,但我的函数所做的是专门避免构建集合,因此这些函数无法操作。可以做一些类似于我得到标准的事情。然后你需要保持一个平方数的运行和,以及运行和计数。最后,你可以从那里计算出std。最好使用标准偏差的定义。我将尝试修改计算总和的行。
julia> a
3-element Array{Array{Float64,2},1}:
[5.0 3.5; 6.0 3.6; 7.0 3.0]
[5.0 4.5; 6.0 4.7; 8.0 3.0]
[5.0 4.0; 6.0 3.2; 8.0 4.0]
julia> aggregate(a)
4×2 Array{Float64,2}:
5.0 4.0
6.0 3.83333
7.0 3.0
8.0 3.5
function accumarrays(A::Vector{Matrix{T}}) where {T}
d = Dict{T, Tuple{T, Int}}()
for a in A
for i in indices(a, 1)
ai = a[i, 1]
d[ai] = get(d, ai, (zero(T), 0)) .+ (a[i, 2], 1)
end
end
Aout = Matrix{typeof(one(T)/1)}(length(d), 2)
i = 0
for (key, val) in d
Aout[i+=1, 1] = key
Aout[i, 2] = val[1] / val[2]
end
return Aout
end
function accumarrays_(A::Vector{Matrix{T}}) where {T}
d = Dict{T, Tuple{T, Int}}()
for a in A
for i in indices(a, 1)
ai = a[i, 1]
d[ai] = get(d, ai, (zero(T), 0)) .+ (a[i, 2], 1)
end
end
dkeys = sort!(collect(keys(d)))
Aout = Matrix{typeof(one(T)/1)}(length(dkeys), 2)
for i in eachindex(dkeys)
val = d[dkeys[i]]
Aout[i, 1] = dkeys[i]
Aout[i, 2] = val[1] / val[2]
end
return Aout
end