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

4

在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

请参考以下链接:https://docs.julialang.org/en/v1/base/iterators/#Base.Iterators.flatten - Mike 'Pomax' Kamermans
3个回答

12

您可以使用vec (https://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

谢谢,但我想要行并排放置,这需要转置数组。 - bitWise
4
Julia是列优先存储的,所以按行处理会更慢,我不认为这是个好主意。如果可能的话,你应该尝试设计算法沿着列进行计算。如果必须这样做,可以使用 vec(A') - DNF

4
为了补充当前解决方案,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 

您可以热切地使用for循环在A的索引上:

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

2

如果您使用列主序形式来利用Julia的数组排序,则可以选择另一种选项:

A = randn(10,10)
10×10 Array{Float64,2}:

a = A[:]
100-element Array{Float64,1}:

: 将每个列按顺序放入输出向量中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接