【问题标题】:Julia iteratively make 3D array from 2D arraysJulia 从 2D 数组迭代地制作 3D 数组
【发布时间】:2021-07-03 18:33:23
【问题描述】:

我正在尝试从许多 2D 数组中创建一个 3D 数组。

图像文件

每张图片都变成一个二维数组。

https://drive.google.com/drive/folders/1xBucvqhKFjAfbRIhq5wjr40kSjNor_0t?usp=sharing

using Images, Colors

paths = readdir(
    "/Users/me/Downloads/ct_scans"
    , join = true
)

images_3D = []

for p = paths
    img = load(p)
    gray = Gray.(img)
    arr = convert(Array{Float64}, gray) # <----- 2D array
    append!(images_3d, arr)
end


>>> size(images_3d) 
(1536000) # <--- 1D view? 

>>> 1536000 == 80*160*120 
true

>>> reshaped_3d = reshape(images_3d, (80,160,120))

>>> Gray.(reshaped_3d[1,:,:])
# 160x120 scrambled mess of pixels not rearranged as expected
  • append! 创建一个 size== 1D 数组,它没有按预期重塑。
  • push! 创建一个保持其形状的硬阵列阵列。从技术上讲,它不是 3D,只是一个 80 元素向量。
  • 当我尝试初始化一个空的 3D,然后用我自己的 2D 图像覆盖每个 2D 时,我收到Matrix{Float64} to Float64 类型转换失败。
  • 无法迭代vcat 2D 数组,因为无法覆盖变量。

发布此内容的部分原因是为了了解 Julia 程序员如何处理多维数组。

【问题讨论】:

    标签: arrays julia


    【解决方案1】:

    有多种方法可以做到这一点,您必须 tty 并测试哪种方法最适合您的情况。

    带有追加!并调整大小

    Arrays 在 Julia 中应该从第一个索引开始迭代,图像的数量是最后一个索引。如果图像数量为 80,则 reshape 应为 reshape(images_3d, (160,120,80)) (可能交换120和160,这个不确定)。

    然后得到第一张图片,它是reshaped_3d[:,:,1]

    用推!

    push!ing 矩阵,然后使用cat 创建 3d 数组也可以:

    julia> A = [rand(3,4) for i in 1:2];
    
    julia> cat(A..., dims=3)
    3×4×2 Array{Float64, 3}:
    [:, :, 1] =
     0.372747  0.17654   0.398272  0.231992
     0.514789  0.342374  0.399816  0.277959
     0.908909  0.864676  0.9788    0.585375
    
    [:, :, 2] =
     0.358169  0.816448  0.0558052  0.404178
     0.747453  0.80815   0.384903   0.447053
     0.314895  0.46264   0.947465   0.170982
    

    初始化 3D 数组(可能是最好的)

    逐步填满

    julia> A = Array{Float64}(undef,3,4,2);
    
    julia> for i in 1:2
               A[:,:,i] = rand(3,4)
           end
    
    julia> A
    3×4×2 Array{Float64, 3}:
    [:, :, 1] =
     0.478106  0.829818  0.526572  0.644238
     0.714812  0.781246  0.93239   0.759864
     0.523958  0.955136  0.70079   0.193489
    
    [:, :, 2] =
     0.481405   0.561407  0.184557    0.449584
     0.547769   0.170311  0.371797    0.538843
     0.0285712  0.731686  0.00126473  0.452273
    

    【讨论】:

    • 我特别推荐最后一个(预分配数组并填充它),因为这通常是最有效的,如果你在尺寸上犯了错误,它通常会给出明显的错误
    • 谢谢。使 n/samples 成为 2D 矩阵覆盖原始值的最后一个维度。
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多