在Julia中收集数组元素

3

我希望了解如何收集n行m列的数组元素并将它们存储到n个m维向量中。例如,我有以下3 x 2的数组,我想将每一行的一对元素存储到一个向量中。

Array1 = [ 1 0; 2 0; 3 0]

这将产生:

3×2 Array{Int64,2}:
1  0
2  0
3  0

这个想法是创建一个for循环,每次迭代将上面数组的值存储到一个二维向量中。

我不确定如何做到这一点,因为从我的实验中可以看出,collect函数只会保存同一列的元素。

那么我怎样才能将每对数据存储到向量中呢?


2
这里使用 eachrow 还是 eachcol 会更有帮助呢? - Oscar Smith
我需要找到文档来看它是否有帮助(以前从未使用过)。 - Marion
它可能有帮助,但我如何定义/保存每次的新向量? - Marion
2个回答

6

它可以很简单,就像 collect(eachrow(Array1)) 这样。

julia> collect(eachrow(Array1))
3-element Vector{SubArray{Int64, 1, Matrix{Int64}, Tuple{Int64, Base.Slice{Base.OneTo{Int64}}}, true}}:
 [1, 0]
 [2, 0]
 [3, 0]

这是一个短小的、更重要的是类型稳定的解决方案,因此它比Any[]解决方案更高效。但它创建了底层Matrix的视图,有时这不是您想要的,特别是考虑到Julia是按列导向的,所以行视图将相对较慢。如果是这种情况,您可以选择

julia> collect.(eachrow(Array1))
3-element Vector{Vector{Int64}}:
 [1, 0]
 [2, 0]
 [3, 0]

这个方法仍然非常快。

但是你也可以考虑如何使用这种方式。例如,如果你只想遍历行,那么根本不需要收集任何东西,可以直接使用eachrow而不需要中间材料化。


0

好的,我找到了一个令人满意的答案,我将在此发帖供日后参考。

首先,我定义了一个可以取任何值的向量列表:

listV = Any[];

然后我创建了一个 for 循环,使用 eachrow 将数组 Array 的每一对元素存储起来:
for row in eachrow(Array);
    push!(listV, row);
end

这已经足够好了。


我最终使用了类似于 Array{Float64}(undef, 1, 2); 的东西。 - Marion
1
我删除了我的评论,@Marion在你上面的那个,因为它是不正确的。但是,Array{Float64}(undef, 1, 2)也没有意义。你可以使用Vector{Vector{eltype(Array1)}}(undef, size(Array1, 1))。但你真的应该使用@AndrejOskin的解决方案,它绝对是最惯用和优雅的。 - DNF

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