Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unzip an array of tuples in julia

Tags:

julia

Suppose I have an array of tuples:

arr = [(1,2), (3,4), (5,6)]

With python I can do zip(*arr) == [(1, 3, 5), (2, 4, 6)]

What is the equivalent of this in julia?

like image 724
Eadan Fahey Avatar asked Apr 01 '16 23:04

Eadan Fahey


2 Answers

As an alternative to splatting (since that's pretty slow), you could do something like:

unzip(a) = map(x->getfield.(a, x), fieldnames(eltype(a)))

This is pretty quick.

julia> using BenchmarkTools
julia> a = collect(zip(1:10000, 10000:-1:1));
julia> @benchmark unzip(a)
BenchmarkTools.Trial: 
  memory estimate:  156.45 KiB
  allocs estimate:  6
  --------------
  minimum time:     25.260 μs (0.00% GC)
  median time:      31.997 μs (0.00% GC)
  mean time:        48.429 μs (25.03% GC)
  maximum time:     36.130 ms (98.67% GC)
  --------------
  samples:          10000
  evals/sample:     1

By comparison, I have yet to see this complete:

@time collect(zip(a...))
like image 67
ivirshup Avatar answered Sep 28 '22 01:09

ivirshup


Following up on @ivirshup 's answer I would like to add a version that is still an iterator

unzip(a) = (getfield.(a, x) for x in fieldnames(eltype(a)))

which keeps the result unevaluated until used. It even gives a (very slight) speed improvement when comparing

@benchmark a1, b1 = unzip(a)
BenchmarkTools.Trial: 
  memory estimate:  156.52 KiB
  allocs estimate:  8
  --------------
  minimum time:     33.185 μs (0.00% GC)
  median time:      76.581 μs (0.00% GC)
  mean time:        83.808 μs (18.35% GC)
  maximum time:     7.679 ms (97.82% GC)
  --------------
  samples:          10000
  evals/sample:     1

vs.

BenchmarkTools.Trial: 
  memory estimate:  156.52 KiB
  allocs estimate:  8
  --------------
  minimum time:     33.914 μs (0.00% GC)
  median time:      39.020 μs (0.00% GC)
  mean time:        64.788 μs (16.52% GC)
  maximum time:     7.853 ms (98.18% GC)
  --------------
  samples:          10000
  evals/sample:     1
like image 23
HHFox Avatar answered Sep 28 '22 02:09

HHFox