给定维度上数组元素的总和

时间:2018-10-31 03:50:44

标签: julia

我对朱莉娅(Julia)很陌生,他通过做一些项目来学习这些东西。

我被困在按元素求和所有矩阵数组的部分。

我天真2 * 2 * 1000 3维数组。基本上,它可以找到1000个样本的平均方差-协方差矩阵。迭代1到1000。

我尝试使用Sum命令,但它给了我标量。 我需要[2,2,1] + [2,2,2] + [2,2,3] + ... [2,2,100] =(2 x 2矩阵)

有没有不用循环的简单方法吗?

1 个答案:

答案 0 :(得分:2)

正如注释中已经指出的那样,如果您有3维数组,

julia> x = rand(2,2,1000);

您可以使用(取自?sum)来对任意维度求和

  

sum(A::AbstractArray; dims)

     

数组在给定维度上的总和。

就您而言,

julia> result = sum(x, dims=3);

但是请注意,结果仍将具有3维,可以通过ndims或通过使用typeof检查类型来检查:

julia> ndims(result)
3

julia> typeof(result)
Array{Float64,3}

此行为的原因是类型稳定性。我们总结的第三个维度将是单例维度,

julia> size(result)
(2, 2, 1)

可以拖放以得到所需的2x2矩阵结果

julia> dropdims(result, dims=3)
2×2 Array{Float64,2}:
 510.444  503.893
 489.592  480.065

总共dropdims(sum(x, dims=3), dims=3)

备注(更新)

在朱莉娅,循环很快。因此,如果不只是为了方便起见,您可以使用循环实现来更快地获得结果,例如

julia> function f(x::AbstractArray{<:Number, 3})
           nrows, ncols, n = size(x)
           result = zeros(eltype(x), nrows, ncols)
           for k in 1:n
               for j in 1:ncols
                   for i in 1:nrows
                       result[i,j] += x[i,j,k]
                   end
               end
           end
           result
       end
f (generic function with 1 method)

julia> @btime dropdims(sum($x, dims=3), dims=3);
  7.034 μs (19 allocations: 592 bytes)

julia> @btime f($x);
  5.205 μs (1 allocation: 112 bytes)