# Accessing Different Indexes in Arrays

**URL:** <https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284>\
**Category:** General Usage\
**Tags:** array\
**Created:** [October 22, 2023, 5:05pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284 "2023-10-22T17:05:09Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ivanricardo](https://avatars.discourse-cdn.com/v4/letter/i/91b2a8/32.png) [@ivanricardo](https://discourse.julialang.org/u/ivanricardo)\
**Post date:** [October 22, 2023, 5:05pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/1 "2023-10-22T17:05:09Z")

</div>

Hello,

I have the current function in Julia but I realize it is quite repetitive and bad. Is there any way of generalizing this function? I want to create a function that takes in an array and range and returns the array indexed from the last dimension.

```julia
    function lastdimrange(arr::Array{T,N}, r::R) where {T,N,R}
        if N == 1
            return arr[r]
        elseif N > 1
            new_dims = tuple((size(arr, i) for i in 1:N-1)..., length(r))
            result = similar(arr[:, :, 1], new_dims)
            if N == 2
                result .= arr[:, r]
            elseif N == 3
                result .= arr[:, :, r]
            elseif N == 4
                result .= arr[:, :, :, r]
            elseif N == 5
                result .= arr[:, :, :, :, r]
            elseif N == 6
                result .= arr[:, :, :, :, :, r]
            elseif N == 7
                result .= arr[:, :, :, :, :, :, r]
            else
                error("This function does not support arrays with more than 7 dimensions.")
            end
            return result
        else
            error("Invalid array dimensions.")
        end
    end

```

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [October 22, 2023, 5:20pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/2 "2023-10-22T17:20:29Z")

</div>

I think you may want some variation of the following.

```julia
    eachslice(arr; dims=N)[r]

```

---

<div class="post-metadata">

**Author:** ![ivanricardo](https://avatars.discourse-cdn.com/v4/letter/i/91b2a8/32.png) [@ivanricardo](https://discourse.julialang.org/u/ivanricardo)\
**Post date:** [October 22, 2023, 5:58pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/3 "2023-10-22T17:58:35Z")

</div>

This looks promising! But when r is a range from, say, 1:2, is there any way of obtaining an array object? I get a strange two element vector.

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [October 22, 2023, 6:16pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/4 "2023-10-22T18:16:29Z")

</div>

Does `stack(eachslice(A, dims=3)[1:2])` do what you want?

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [October 22, 2023, 6:20pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/5 "2023-10-22T18:20:49Z")

</div>

Another approach more similar to your original one might be

```julia
idx = ntuple(i->i == N ? r : Colon(), N)
arr[idx...]

```

---

<div class="post-metadata">

**Author:** ![nsajko](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nsajko/32/221187_2.png) [@nsajko](https://discourse.julialang.org/u/nsajko)\
**Post date:** [October 22, 2023, 7:10pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/6 "2023-10-22T19:10:10Z")

</div>

```julia
colons(::V) where {V<:Val} = ntuple((i -> (:)), V())
lastdimrange(a::AbstractArray{T, n}, r) where {T, n} = a[colons(Val{n - 1}())..., r]
lastdimrange(a::AbstractArray{<:Any, 0}, ::Any) = error("nonsensical")

```

---

<div class="post-metadata">

**Author:** ![ivanricardo](https://avatars.discourse-cdn.com/v4/letter/i/91b2a8/32.png) [@ivanricardo](https://discourse.julialang.org/u/ivanricardo)\
**Post date:** [October 23, 2023, 7:49am UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/7 "2023-10-23T07:49:25Z")

</div>

Thank you all! I found that selectdim() actually was what I was looking for.

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [October 23, 2023, 2:35pm UTC](https://discourse.julialang.org/t/accessing-different-indexes-in-arrays/105284/8 "2023-10-23T14:35:46Z")

</div>

naturally the solution is the one already indicated

```julia
selectdim(arr,ndims(arr),r) 

```

but only to add a different way to the first proposals

```julia
arr[axes(arr)[1:end-1]...,r]

```
