在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次通過陣列並且看起來不那麼漂亮:-) –