2017-08-28 172 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