在Julia中对多维数组进行子采样

时间:2017-05-18 05:35:42

标签: multidimensional-array julia

我有一个大小为330x534x223的数组,其中包含值的分布,如3d图像。它的大小对我来说太大了,所以我希望在每个维度上重新采样20倍。

有什么可以想到的方法吗?我试过检查文档

谢谢

2 个答案:

答案 0 :(得分:9)

如果你正在思考"缩略图,"然后只是采取每20个元素可能不满意。对于同时平滑和子样本以及非常好的性能的内容,我建议来自JuliaImages的restrict(减少2倍,你可以重复调用它)。

答案 1 :(得分:5)

这个怎么样?

julia> subsample(a, n) = getindex(a, (indices(a,i)[1:n:end] for i=1:ndims(a))...)
subsample (generic function with 1 method)

julia> a = reshape(1:10^6, (100,100,100));

julia> subsample(a, 50)
2×2×2 Array{Int64,3}:
[:, :, 1] =
  1  5001
 51  5051

[:, :, 2] =
 500001  505001
 500051  505051

这也适用于具有非常规索引的数组,如OffsetArrays

对于大型数组,与使用范围的直接索引相比,此实现的开销可以忽略不计。

修改 类型稳定版本:

subinds(n, inds) = (first(inds)[1:n:end], subinds(n, Base.tail(inds))...)
subinds(n, ::Tuple{}) = ()
subsample(a, n) = getindex(a, subinds(n, indices(a))...)