【问题标题】:Subsampling a multidimensional array in Julia在 Julia 中对多维数组进行二次采样
【发布时间】:2017-05-18 05:35:41
【问题描述】:

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

有没有什么可行的方法可以做到这一点?我试过检查文档

谢谢

【问题讨论】:

  • 查看JuliaImages Organization。他们有大量用于处理图像的工具箱,其中必须有一些东西。
  • subsample = [big[i,j,k] for i=1:20:size(big,1),j=1:20:size(big,2),k=1:20:size(big,3)] 可能是一种方式(我称数组为big)。
  • @DanGetz 这比B[1:20:end, 1:20:end, 1:20:end] 有什么优势?它看起来既冗长又慢。
  • @DNF 没有优势。只是更明确,我首先想到的是,关于视图与复制语义没有混淆。
  • 查看与复制我得到,但我不认为它更明确。也许我的 Matlab 背景是通过,但我认为切片语法是如此明显,它让我感到困惑,没有人提到它。

标签: multidimensional-array julia


【解决方案1】:

如果您正在考虑“缩略图”,那么仅获取每 20 个元素可能并不令人满意。对于能够同时平滑和二次采样并具有非常好的性能的东西,我推荐来自 JuliaImages 的restrict(它减少了 2 倍,您可以重复调用它)。

【讨论】:

  • 是的,这就是我所追求的那种方法。也许二次抽样是一个糟糕的词选择。
【解决方案2】:

这个怎么样?

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

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

编辑: A型稳定版:

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))...)

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2013-04-20
    • 2019-10-22
    • 2013-12-17
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多