# Iterating over and slicing a multidimensional array

**URL:** https://discourse.julialang.org/t/iterating-over-and-slicing-a-multidimensional-array/39683
**Category:** New to Julia
**Tags:** arrays
**Created:** [May 18, 2020, 8:37am UTC](https://discourse.julialang.org/t/iterating-over-and-slicing-a-multidimensional-array/39683 "2020-05-18T08:37:45Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![apbraun](https://avatars.discourse-cdn.com/v4/letter/a/ecccb3/32.png) [@apbraun](https://discourse.julialang.org/u/apbraun)
#### Post date: [May 18, 2020, 8:37am UTC](https://discourse.julialang.org/t/iterating-over-and-slicing-a-multidimensional-array/39683/1 "2020-05-18T08:37:45Z")

</div>

Is it possible to iterate over a multidimensional array and slice the different dimensions in a loop? For example instead of

```julia-repl
julia> a = zeros(2,2)
2×2 Array{Float64,2}:
 0.0 0.0
 0.0 0.0

julia> for i in 1:2
           a[i,:] = ones(2)
       end

julia> for j in 1:2
           a[:,j] = j * ones(2)
       end

```

Is there a possibility to write something like

```julia-repl
julia> for dim in 1:2
            for i in 1:size(a)[dim]
                a[slice(i,dim)] = i * ones(2)
            end
        end

```

wher `slice(i,1)` would create Indices similar to `i,:`.

---

<div class="post-metadata">

### Author: ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)
#### Post date: [May 18, 2020, 9:34am UTC](https://discourse.julialang.org/t/iterating-over-and-slicing-a-multidimensional-array/39683/2 "2020-05-18T09:34:45Z")

</div>

You could try to use `eachslice`. It isn’t quite as elegant as you would hope but here goes:

```julia
julia> a = zeros(2,2);

julia> for (i, b) in enumerate(eachslice(a; dims=1))
           b .= i
       end

julia> a
2×2 Array{Float64,2}:
 1.0 1.0
 2.0 2.0

julia> for (i, b) in enumerate(eachslice(a; dims=2))
           b .= i
       end

julia> a
2×2 Array{Float64,2}:
 1.0 2.0
 1.0 2.0

```

Do you mind if i nitpick your code, btw? (I love nitpicking code, you see…)

Don’t do this:

```julia
for j in 1:2
    a[:,j] = j * ones(2)
end

```

On the right hand side here you allocate, not one, but _two_ unnecessary temporary arrays. First, `ones(2)` allocates, and the multiplication with `j` allocates _another_ array. Instead, just write

```julia
for j in 1:2
    a[:,j] .= j
end

```

No allocations! (Also, `size(a)[dim]` should be `size(a, dim)`, which is a _really_ tiny nit.)

---

<div class="post-metadata">

### Author: ![apbraun](https://avatars.discourse-cdn.com/v4/letter/a/ecccb3/32.png) [@apbraun](https://discourse.julialang.org/u/apbraun)
#### Post date: [May 18, 2020, 12:02pm UTC](https://discourse.julialang.org/t/iterating-over-and-slicing-a-multidimensional-array/39683/3 "2020-05-18T12:02:57Z")

</div>

First of all thank you for your fast answer and the nitpicking 😉

> [@DNF](#):
>
> No allocations! (Also, `size(a)[dim]` should be `size(a, dim)` , which is a _really_ tiny nit.)

Does it make sense to use `size(a, dim)` even if size would be called more than once?  
And since you said you love nitpicking code, I’ve written some kind of n-dimensional gradient function and was wondering if this could get more efficient?

```julia
function gradient(array::AbstractArray)

    N = size(array)
    grad_array = [zeros(N) for dim ∈ 1:length(N)]

    for dim ∈ 1:length(N)
        for (grad, field) ∈ zip(eachslice(array; dims = dim), eachslice(grad_array[dim]; dims = dim))
            finite_derivative!(grad, field, 1.)
        end
    end
    
    grad_array
    
end

function finite_derivative!(derivative, time_series, Δt::AbstractFloat = 1.)
    T = length(time_series)
    
    derivative[1] = (time_series[2]-time_series[1])/Δt
    for t ∈ 2:T-1
        derivative[t] = ((time_series[t+1] - time_series[t-1]) / 2Δt)
    end
    derivative[T] = (time_series[T]-time_series[T-1])/Δt

end
```
