从元组向量到向量元组

Mic*_*ard 5 arrays tuples julia

在 Julia 中,许多事物都表示为小元组数组,例如Points。但有时您希望元素分开,例如提取 x 和 y 坐标进行绘图 - 例如拥有一个数组元组。您可以部分使用zip

pts = [(1,2), (1,3), (2,3), (2,2)]
a,b = collect(zip(pts...))
Run Code Online (Sandbox Code Playgroud)

这会导致元组的元组,尽管您可以

av = [a...]
bv = [b...]
Run Code Online (Sandbox Code Playgroud)

有没有更方便的方法来进行此操作?

Dan*_*etz 4

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

\n\n
julia> using MappedArrays\n\njulia> struct Point\n       x::Float64\n       y::Float64\n       end\n\njulia> pvec = [Point(rand(),rand()) for i=1:10];\n\njulia> b = mappedarray(e->e.x,pvec);\n\njulia> b[3]\n0.9524214421389912\n\njulia> b\n10-element MappedArrays.ReadonlyMappedArray{Float64,1,Array{Point,1},##3#4}:\n 0.383683\n 0.474853\n 0.952421\n 0.388564\n 0.268427\n 0.301026\n 0.117767\n 0.712266\n 0.629364\n 0.227822\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

更新

\n\n

对于元组向量来说,它是mappedarray(e->first(e),tvec)及其变体。例如:

\n\n
julia> tvec = [(rand(),rand()) for i=1:10000];\n\njulia> c = mappedarray(x->first(x),tvec);\n\njulia> c[5]\n0.8626336507168362\n
Run Code Online (Sandbox Code Playgroud)\n\n

最重要的是,事实证明sum(c)速度很快:

\n\n
julia> @btime sum(first.(tvec))\n  21.643 \xce\xbcs (25 allocations: 79.23 KiB)\n5000.93749585252\n\njulia> @btime sum(c)\n  9.850 \xce\xbcs (1 allocation: 16 bytes)\n5000.937495852521\n\njulia> @btime sum(first(x) for x in tvec)\n  10.560 \xce\xbcs (2 allocations: 32 bytes)\n5000.937495852521\n
Run Code Online (Sandbox Code Playgroud)\n