按julia中的公共列值合并大量数组

按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所有

扩展我之前提出的一个问题,假设我们有大量数组(比如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所有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