# Towards an eachsliceX function

**URL:** https://discourse.julialang.org/t/towards-an-eachslicex-function/67145
**Category:** General Usage
**Created:** [August 27, 2021, 7:24pm UTC](https://discourse.julialang.org/t/towards-an-eachslicex-function/67145 "2021-08-27T19:24:36Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Paul\_Soderlind](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/paul_soderlind/32/1753_2.png) [@Paul\_Soderlind](https://discourse.julialang.org/u/Paul_Soderlind)
#### Post date: [August 27, 2021, 7:24pm UTC](https://discourse.julialang.org/t/towards-an-eachslicex-function/67145/1 "2021-08-27T19:24:36Z")

</div>

`eachslice` does the opposite of what I would like. For instance, if `X` is a 3D array, then `eachslice(X,dims=1)` gives an iterator over 2D matrices. Rather, I would like an iterator over all ‘column vectors’, like `eachcol()`. The following code does that for arrays with 3 or fewer dimensions. (It’s straightforward to instead get iterators over rows or ‘aisles’)

Now, my questions is: is there a simple generalisation of this? If so, I think we should make a PR. Suggestions are welcome.

```julia
function eachcol3D(A::AbstractArray)
  if 1 <= ndims(A) <= 2
    z = eachcol(A) #(view(A,:,i) for i in axes(A,2))
  elseif ndims(A) == 3
    z = (view(A,:,i,j) for i in axes(A,2), j in axes(A,3))
  else
    error("this function works only on 1D-3D arrays")
  end
  return z
end

```

---

<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: [August 27, 2021, 7:37pm UTC](https://discourse.julialang.org/t/towards-an-eachslicex-function/67145/2 "2021-08-27T19:37:22Z")

</div>

what’s the “physical” significance of such a column? you can easily reshape it into something that works with `eachcol`:

```julia
julia> a = rand(3,3,3)

julia> yours = first((view(a,:,i,j) for i in axes(a,2), j in axes(a,3)));

julia> first(eachcol(reshape(a, size(a,1), :))) == yours
true

```

I should note `reshape` is non-allocating, comment:

```julia
reshape(a, size(a,1), :)

```

makes a matrix such that each column is as tall as your original first dimension.

* * *

You can also create the same iterator (like your `z`) with:

```julia
Iterators.partition(vec(a), size(a,1))

```

`vec` also doesn’t allocate, it just presents the underlying memory as a 1D vector

---

<div class="post-metadata">

### Author: ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)
#### Post date: [August 27, 2021, 7:50pm UTC](https://discourse.julialang.org/t/towards-an-eachslicex-function/67145/3 "2021-08-27T19:50:42Z")

</div>

> [@Paul\_Soderlind](#):
>
> we should make a PR.

There is [#32310](https://github.com/JuliaLang/julia/pull/32310), with which what you ask for is `eachslice(X, dims=(2,3))`.

---

<div class="post-metadata">

### Author: ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)
#### Post date: [August 30, 2021, 8:48am UTC](https://discourse.julialang.org/t/towards-an-eachslicex-function/67145/4 "2021-08-30T08:48:55Z")

</div>

I find

[https://github.com/bramtayl/JuliennedArrays.jl/](https://github.com/bramtayl/JuliennedArrays.jl/)

very useful for slicing.
