【问题标题】:Collecting elements of an array in Julia在 Julia 中收集数组的元素
【发布时间】:2021-01-05 05:40:13
【问题描述】:

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

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

这给了:

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

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

我不知道该怎么做,因为 collect 函数只会保存我实验中同一列的元素。

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

【问题讨论】:

  • 可以eachroweachcol 帮忙吗?
  • 我将不得不查找文档以查看它是否可以提供帮助(以前从未使用过它们)。
  • 它可能会有所帮助,但我如何每次定义/保存一个新向量?

标签: arrays collections julia


【解决方案1】:

可以简单到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[] 解决方案性能更高。但它会创建底层Matrixview,这有时不是您想要的,特别是考虑到 Julia 是面向列的,因此行视图会相对较慢。如果是这种情况,您可以选择

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

还是很快的。

但您也可以考虑使用这种结构。例如,如果您只想遍历行,那么根本不需要收集,您可以直接使用 eachrow 而无需中间实现。

【讨论】:

    【解决方案2】:

    好的,我找到了一个令人满意的答案,我将在此处发布以供将来参考。

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

    listV = Any[];
    

    然后我创建一个for 循环,使用eachrow 存储数组Array 的每一对元素:

    for row in eachrow(Array);
        push!(listV, row);
    end
    

    这就够了。

    【讨论】:

    • 我最终使用了Array{Float64}(undef, 1, 2);
    • 我删除了我在你@Marion 上方的评论,因为它不正确。但是,Array{Float64}(undef, 1, 2) 也没有任何意义。你可以使用Vector{Vector{eltype(Array1)}}(undef, size(Array1, 1))。但是你真的应该使用@AndrejOskin 的解决方案,它绝对是最地道和优雅的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2020-09-17
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    相关资源
    最近更新 更多