# Is it possible to index an array with a tuple?

**URL:** <https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886>\
**Category:** General Usage\
**Tags:** indexing, array, tuple\
**Created:** [February 6, 2022, 3:20am UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886 "2022-02-06T03:20:07Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 6, 2022, 3:20am UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/1 "2022-02-06T03:20:07Z")

</div>

Is this the only way?

```julia
julia> a
5-element Vector{Float64}:
 3.00000e+00
 2.00000e+00
 5.00000e+00
 9.02242e-01
 7.68556e-01

julia> t
(3, 2, 5)

julia> a[[t...]]
3-element Vector{Float64}:
 5.00000e+00
 2.00000e+00
 7.68556e-01

```

This allocates ☹

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [February 6, 2022, 3:38am UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/2 "2022-02-06T03:38:01Z")

</div>

`[a[i] for i in t]`?

or

```julia
julia> @benchmark view($a, SVector($t))
BenchmarkTools.Trial: 10000 samples with 1000 evaluations.
 Range (min … max): 2.584 ns … 8.786 ns ┊ GC (min … max): 0.00% … 0.00%
 Time (median): 2.605 ns ┊ GC (median): 0.00%
 Time (mean ± σ): 2.618 ns ± 0.136 ns ┊ GC (mean ± σ): 0.00% ± 0.00%

   ▁█▁                                                       
  ████▅▂▂▂▂▂▁▂▂▂▂▂▂▂▂▁▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▂▂▂▂▂▂ ▂
  2.58 ns Histogram: frequency by time 3.17 ns <

 Memory estimate: 0 bytes, allocs estimate: 0.
```

---

<div class="post-metadata">

**Author:** ![trilobit](https://avatars.discourse-cdn.com/v4/letter/t/a8b319/32.png) [@trilobit](https://discourse.julialang.org/u/trilobit)\
**Post date:** [February 6, 2022, 9:50am UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/3 "2022-02-06T09:50:58Z")

</div>

Yes, with “Labelled Arrays”

i.e.

```julia
using LabelledArrays

r = []
for x = 1:12 push!(r, x*30-29:x*30) end
l=(:a1,:a2,:a3,:a4,:b1,:b2,:b3,:b4,:c1,:c2,:c3,:c4)
LA = @SLArray (3,10,2,2,3) (NamedTuple{l}(r))
LA = LA(rand(1:50, 3,10,2,2,3)) 

println(LA,"\n")
println(LA.c3')
println(LA.c4[2:3:30])  

```

---

<div class="post-metadata">

**Author:** ![fgerick](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fgerick/32/13228_2.png) [@fgerick](https://discourse.julialang.org/u/fgerick)\
**Post date:** [February 6, 2022, 10:48am UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/4 "2022-02-06T10:48:19Z")

</div>

Or if you don’t need a vector as output

```julia
julia> map(t->getindex(a,t),t)
(5.0, 2.0, 0.768556)

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [February 6, 2022, 10:53am UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/5 "2022-02-06T10:53:58Z")

</div>

Another option:

```julia
a[collect(Iterators.flatten(t))]

```

---

<div class="post-metadata">

**Author:** ![Seif\_Shebl](https://avatars.discourse-cdn.com/v4/letter/s/eada6e/32.png) [@Seif\_Shebl](https://discourse.julialang.org/u/Seif_Shebl)\
**Post date:** [February 6, 2022, 1:47pm UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/6 "2022-02-06T13:47:38Z")

</div>

```julia
@btime getindex.(($a,), $t)
  2.000 ns (0 allocations: 0 bytes)
(5.0, 2.0, 0.768556)

```

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 6, 2022, 2:21pm UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/7 "2022-02-06T14:21:59Z")

</div>

> [@rafael.guerra](#):
>
> `a[collect(Iterators.flatten(t))]`

Alas:

```julia
julia> @btime $a[collect(Iterators.flatten($t))]
  75.617 ns (2 allocations: 160 bytes)
3-element Vector{Float64}:
 5.00000e+00
 2.00000e+00
 7.68556e-01

```

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 6, 2022, 2:27pm UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/8 "2022-02-06T14:27:22Z")

</div>

I realize I omitted an important aspect of this: I wish to assign to a subarray. Like this:

```julia
julia> @btime $a[[$t...]] .= 0
  40.445 ns (1 allocation: 80 bytes)
3-element view(::Vector{Float64}, [3, 2, 5]) with eltype Float64:
 0.00000e+00
 0.00000e+00
 0.00000e+00

```

which, as you can see, allocates.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 6, 2022, 2:55pm UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/9 "2022-02-06T14:55:12Z")

</div>

That’s the ticket!

```julia
julia> @btime $a[SVector($t)] .= 0
  4.300 ns (0 allocations: 0 bytes)
3-element view(::Vector{Float64}, [3, 2, 5]) with eltype Float64 with indices SOneTo(3):
 0.00000e+00
 0.00000e+00
 0.00000e+00

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [February 6, 2022, 4:38pm UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/11 "2022-02-06T16:38:08Z")

</div>

> [@PetrKryslUCSD](#):
>
> That’s the ticket!

Are you sure that using StaticArrays for this is better than the simple, more general Julia `for loop`?

```julia
for i in t
   a[i] = 0
end

```

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 6, 2022, 6:29pm UTC](https://discourse.julialang.org/t/is-it-possible-to-index-an-array-with-a-tuple/75886/12 "2022-02-06T18:29:54Z")

</div>

> [@rafael.guerra](#):
>
> ```julia
> for i in t
> a[i] = 0
> end
> 
> ```

Indeed, it is not.

```julia
julia> @btime for i in $t
          $a[i] = 0
       end
  3.200 ns (0 allocations: 0 bytes)

julia> @btime $a[SVector($t)] .= 0
  4.300 ns (0 allocations: 0 bytes)
3-element view(::Vector{Float64}, [3, 2, 5]) with eltype Float64 with indices SOneTo(3):
 0.00000e+00
 0.00000e+00
 0.00000e+00

```
