如何在Julia中展平2D数组?

时间:2019-11-02 18:28:42

标签: julia

julia中是否有一个将2D数组转换为1D数组的函数? 例如,我知道如何通过定义函数来实现此功能,但我不想每次都编写它。

function flatten(Mat)
n, m = size(Mat)
flattened = zeros(m*n)
for i=1:n
    for j=1:m
        flattened[(i-1)*m + j] = Mat[i,j]
    end
end
return flattened
end

3 个答案:

答案 0 :(得分:5)

您可以使用vechttps://docs.julialang.org/en/v1/base/arrays/#Base.vec):

julia> A = rand(2, 2)                                                     
2×2 Array{Float64,2}:
 0.843062  0.164179
 0.167501  0.800111

julia> vec(A)                                                             
4-element Array{Float64,1}:
 0.8430624537022231 
 0.16750120450998196
 0.16417911360611237
 0.8001111380491013

答案 1 :(得分:1)

另一种选择,如果您使用以列为主的形式来利用julia的数组顺序:

A = randn(10,10)
10×10 Array{Float64,2}:
a = A[:]
100-element Array{Float64,1}:

其中:将各列顺序放入输出向量。

答案 2 :(得分:0)

要添加到当前的解决方案中,Iterators.flatten会以一种惰性的方式进行操作,而不是在内存中移动内容,而是定义一个迭代器来逐个返回元素:

julia> A = rand(2,2)
2×2 Array{Float64,2}:
 0.667687  0.016606
 0.720289  0.12541 

julia> collect(Iterators.flatten(A))
4-element Array{Float64,1}:
 0.6676867119775669  
 0.7202889070377703  
 0.016606038041509397
 0.12540966422381583 

很显然,您可以对A的索引使用理解:

julia> [A[i] for i in eachindex(A)]
4-element Array{Float64,1}:
 0.6676867119775669  
 0.7202889070377703  
 0.016606038041509397
 0.12540966422381583