Unpack vector of tuples from broadcasted function

Hello,

I think this is really simple but I can’t figure it out.

I have a function which I broadcast, something like:

function gives3(x)
    return x^2, x^3, x^4
end

inputs = [1, 2, 3, 4, 5]

output = gives3.(inputs)

output is a Vector{Tuple{Int64, Int64, Int64}}. I want to unpack these tuples and have them in separate vectors, so that when I write (or something similar):

v1, v2, v3 = gives3.(inputs)

I’d like:

julia> v2
5-element Vector{Int64}:
   1
   8
  27
  64
 125

Any idea on how to make this happen? I’m OK changing how gives3() returns stuff as long as I can return 3 elements.

Thanks!

One way:

julia> v1, v2, v3 = [getindex.(output, i) for i ∈ 1:3]
3-element Vector{Vector{Int64}}:
 [1, 4, 9, 16, 25]
 [1, 8, 27, 64, 125]
 [1, 16, 81, 256, 625]
1 Like

Thanks! I’d like to simply change the syntax without calling another function or looping over output.

try defining new method for arrays, using broadcast internally not externally to the function:

julia> function gives3(x::Array)
           return x.^2, x.^3, x.^4
       end
gives3 (generic function with 2 methods)
julia> inputs = [1, 2, 3, 4, 5]
5-element Vector{Int64}:
 1
 2
 3
 4
 5

julia> v1,v2,v3 = gives3(inputs)
([1, 4, 9, 16, 25], [1, 8, 27, 64, 125], [1, 16, 81, 256, 625])

julia> v2
5-element Vector{Int64}:
   1
   8
  27
  64
 125

1 Like

The Unzip package implements this:

using Unzip

v1, v2, v3 = unzip(gives3.(inputs))
2 Likes

Ditto for the SplitApplyCombine package via the invert() function

2 Likes