2017-08-28 169 views
3

在Julia中,许多事物都表示为小元组的阵列,如Point s。但有时候你会希望元素分离,例如为绘图提取x和y坐标 - 例如有一个数组的元组。您可以使用部分zip从元组向量到向量元组

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

这导致了一个元组的元组,虽然,虽然可以

av = [a...] 
bv = [b...] 

是否有这样做的操作更方便的方法?

+0

有什么错裸内涵? 'av = [i [1] for i in pts]' – Gnimuc

+1

除此之外没有什么区别,除了这需要N次通过阵列并且看起来不那么漂亮:-) –

回答

3

礼貌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 
+1

喜欢它! :heart_eyes: –

+0

aha,一种比理解更好的懒惰和有益的方式。 – Gnimuc