【问题标题】:Julia mapping a function that returns a 2 dimensional array to a 3 dimensional arrayJulia 将返回 2 维数组的函数映射到 3 维数组
【发布时间】:2017-07-28 20:32:37
【问题描述】:

我有一个返回二维数组的函数。 如果我 map 这个函数到 UnitRange 我得到一个二维数组的一维数组。 有没有一种巧妙的方法将其收集到 3 维数组中?

y = rand(3,3)
f(x) = y * x
map(f, 1:9)

这将导致9-element Array{Array{Float64},2} 而不是Array{Float64,3}。 使用推导也可以达到同样的效果。

【问题讨论】:

  • 或者让函数以UnitRange 作为输入并始终返回一个 3 维数组是否是更好的解决方案?
  • cat(3,map(f,1:9)...) 是一种可能性
  • [i*j for i in y,j=1:9] 是另一个没有定义 f
  • 这确实产生了一个 3 维数组,但结果仍然是数组数组 9x1x1 Array{Array{Float64,2},3} 而不是 3x3x9 Array{Float64,3}
  • 实际上 cat 表达式确实有效,我错过了省略号 ...。现在它按预期工作。

标签: function multidimensional-array julia


【解决方案1】:

你可以使用cat函数,按照Julia documentation

cat(dims, A...)

沿指定连接输入数组 可迭代维度中的维度。

例如,下面的 concatenates 在第三维中的两个二维数组。

julia> A = collect(reshape(1:9, 3, 3));

julia> B = collect(reshape(10:18, 3, 3));

julia> cat(3, A, B)
3×3×2 Array{Int64,3}:
[:, :, 1] =
 1  4  7
 2  5  8
 3  6  9

[:, :, 2] =
 10  13  16
 11  14  17
 12  15  18

将此应用于您的情况,您可以在数组数组中foldl...

foldl((A,B) -> cat(3, A, B), map(f, 1:9))

不过,对于更简洁的解决方案,您可以使用 splat (...) 运算符将所有数组结果传递给 cat 函数的一次调用。

cat(3, map(f, 1:9)...)

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2016-12-30
    • 2014-11-02
    • 2016-07-02
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多