gpt4 book ai didi

arrays - 从元组向量到向量元组

转载 作者:行者123 更新时间:2023-12-01 13:31:04 27 4
gpt4 key购买 nike

在 Julia 中,很多东西都表示为小元组的数组,例如 Point s。但有时您希望将元素分开,例如提取 x 和 y 坐标以进行绘图 - 例如有一个数组元组。您可以部分使用 zip :

pts = [(1,2), (1,3), (2,3), (2,2)]
a,b = collect(zip(pts...))

这会导致一个元组元组,尽管你可以
av = [a...]
bv = [b...]

有没有更方便的方法来做这个操作?

最佳答案

由 Tim Holy 提供,有 MappedArray 包。有了它,以下对眼睛和处理器来说很容易:

julia> using MappedArrays

julia> struct Point
x::Float64
y::Float64
end

julia> pvec = [Point(rand(),rand()) for i=1:10];

julia> b = mappedarray(e->e.x,pvec);

julia> b[3]
0.9524214421389912

julia> b
10-element MappedArrays.ReadonlyMappedArray{Float64,1,Array{Point,1},##3#4}:
0.383683
0.474853
0.952421
0.388564
0.268427
0.301026
0.117767
0.712266
0.629364
0.227822

像往常一样,应该明确地衡量性能,但如果正确地内联,应该没问题。

更新

对于元组向量,它将是 mappedarray(e->first(e),tvec)和变化。例如:
julia> tvec = [(rand(),rand()) for i=1:10000];

julia> c = mappedarray(x->first(x),tvec);

julia> c[5]
0.8626336507168362

关键是,事实证明 sum(c)很快:
julia> @btime sum(first.(tvec))
21.643 μs (25 allocations: 79.23 KiB)
5000.93749585252

julia> @btime sum(c)
9.850 μs (1 allocation: 16 bytes)
5000.937495852521

julia> @btime sum(first(x) for x in tvec)
10.560 μs (2 allocations: 32 bytes)
5000.937495852521

关于arrays - 从元组向量到向量元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com