2017-08-28 8 views
3

ジュリアでは、多くのものがPointのような小さなタプルの配列として表されます。しかし、プロットするためのx座標とy座標を抽出するなど、要素を別々にしたい場合もあります。配列のタプルを持つこと。あなたは、部分的にzipを使用することができます。タプルのベクトルからタプルのベクトルへ

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

これはしかしタプルのタプルにつながる、けれどもすることができます

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

この操作を行うためのより便利な方法はありますか?

+0

裸の内包表記が悪いのでしょうか? 'av = [i [p] in i for i]' – 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

関連する問題