在Julia中,许多事物都表示为小元组的阵列,如Point
s。但有时候你会希望元素分离,例如为绘图提取x和y坐标 - 例如有一个数组的元组。您可以使用部分zip
:从元组向量到向量元组
pts = [(1,2), (1,3), (2,3), (2,2)]
a,b = collect(zip(pts...))
这导致了一个元组的元组,虽然,虽然可以
av = [a...]
bv = [b...]
是否有这样做的操作更方便的方法?
在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
像往常一样,性能应该明确的衡量,而应该是OK,如果事情得到正确内联。
UPDATE
元组组成的矢量将是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
喜欢它! :heart_eyes: –
aha,一种比理解更好的懒惰和有益的方式。 – Gnimuc
有什么错裸内涵? 'av = [i [1] for i in pts]' – Gnimuc
除此之外没有什么区别,除了这需要N次通过阵列并且看起来不那么漂亮:-) –