# N-dimensional view into an N+1 dimension array

**URL:** https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345
**Category:** General Usage
**Created:** [May 24, 2023, 7:13pm UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345 "2023-05-24T19:13:06Z")
**Posts on this page:** 16
**Page:** 1

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 24, 2023, 7:13pm UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/1 "2023-05-24T19:13:06Z")

</div>

I have an `Array{T,N+1}` and I want to pass a slice/view of the first `N` dimensions to a function. If I knew, say, `N=2` I would do

```julia
b = @view a[:,:,1]
f(b,args...)

```

But the number of colons depends on `N`. Is there a way to do this for general `N`?

---

<div class="post-metadata">

### Author: ![jishnub](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jishnub/32/33620_2.png) [@jishnub](https://discourse.julialang.org/u/jishnub)
#### Post date: [May 24, 2023, 7:14pm UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/2 "2023-05-24T19:14:07Z")

</div>

> **[GitHub - SciML/EllipsisNotation.jl: Julia-based implementation of ellipsis...](https://github.com/SciML/EllipsisNotation.jl)**
>
> Julia-based implementation of ellipsis array indexing notation \`..\` - GitHub - SciML/EllipsisNotation.jl: Julia-based implementation of ellipsis array indexing notation \`..\`

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 24, 2023, 7:17pm UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/3 "2023-05-24T19:17:45Z")

</div>

Awesome!

---

<div class="post-metadata">

### Author: ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)
#### Post date: [May 24, 2023, 8:02pm UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/4 "2023-05-24T20:02:45Z")

</div>

Or also `selectdim(array,dim_to_select,indx_on_that_dim)`, e.g. `b = selectdim(a,3,1)`

---

<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: [May 24, 2023, 8:23pm UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/5 "2023-05-24T20:23:35Z")

</div>

I really like the solution with selectdim(), but I add this one too

```julia
vv = @view v[ntuple(_->:,ndims(v)-1)...,1]

```

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 25, 2023, 6:20am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/6 "2023-05-25T06:20:28Z")

</div>

Does this produce a “view” or copy to a new array?

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 25, 2023, 6:21am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/7 "2023-05-25T06:21:25Z")

</div>

A tupple of colons! Didn’t know you could do that!

---

<div class="post-metadata">

### Author: ![LaurentPlagne](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/laurentplagne/32/10103_2.png) [@LaurentPlagne](https://discourse.julialang.org/u/LaurentPlagne)
#### Post date: [May 25, 2023, 6:41am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/8 "2023-05-25T06:41:02Z")

</div>

a view [Arrays · The Julia Language](https://docs.julialang.org/en/v1/base/arrays/#Base.selectdim)

---

<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: [May 25, 2023, 6:47am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/9 "2023-05-25T06:47:32Z")

</div>

As far as I understand `(:)` is a function, like `isless()` for example  
It should be equivalent (alias?) of Colon().

But let’s wait for someone who knows to explain better how it works 🙂

---

<div class="post-metadata">

### Author: ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)
#### Post date: [May 25, 2023, 6:58am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/10 "2023-05-25T06:58:05Z")

</div>

Just try it 🙂:

```julia
julia> x = [1 2; 3 4]
2×2 Matrix{Int64}:
 1 2
 3 4
julia> xd2_1 = selectdim(x,2,1)
2-element view(::Matrix{Int64}, :, 1) with eltype Int64:
 1
 3
julia> xd2_1[2] = 30
30
julia> x
2×2 Matrix{Int64}:
  1 2
 30 4

```

---

<div class="post-metadata">

### Author: ![sijo](https://avatars.discourse-cdn.com/v4/letter/s/da6949/32.png) [@sijo](https://discourse.julialang.org/u/sijo)
#### Post date: [May 25, 2023, 7:02am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/11 "2023-05-25T07:02:05Z")

</div>

> [@rocco\_sprmnt21](#):
>
> As far as I understand `(:)` is a function, like `isless()` for example  
> It should be equivalent (alias?) of Colon().

That’s right:

> <https://github.com/JuliaLang/julia/blob/94bc2f3c9f424071a2ef11c348f19a3cdf444603/base/essentials.jl#LL821C1-L823C20>

So `Colon` is a struct type and the singleton instance `Colon()` is a function and `:` is a synonym for that.

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 25, 2023, 8:21am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/13 "2023-05-25T08:21:33Z")

</div>

I don’t have Julia installed on my phone… yet!

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 25, 2023, 8:23am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/14 "2023-05-25T08:23:28Z")

</div>

This is the Base solution, so I’ll switch this to the answer. But `b=@view a(..,i)` from EllipsisNotation.jl is a really nice bit of syntactic sugar.

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 25, 2023, 8:35am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/15 "2023-05-25T08:35:48Z")

</div>

Huh. The ellipsis version works fine on the GPU, but `selectdim` throws an allocation error:

```julia
ERROR: InvalidIRError: compiling MethodInstance for (::GPUArrays.var"#broadcast_kernel#28")(::CUDA.CuKernelContext, ::CuDeviceVector{SVector{3, Float32}, 1}, ::Base.Broadcast.Broadcasted{CUDA.CuArrayStyle{1}, Tuple{Base.OneTo{Int64}}, typeof(interp!), Tuple{Base.Broadcast.Extruded{CuDeviceVector{SVector{3, Float32}, 1}, Tuple{Bool}, Tuple{Int64}}, Base.Broadcast.Extruded{CuDeviceVector{SVector{3, Float32}, 1}, Tuple{Bool}, Tuple{Int64}}, CUDA.CuRefValue{CuDeviceArray{Float32, 4, 1}}}}, ::Int64) resulted in invalid LLVM IR
Reason: unsupported call through a literal pointer (call to ijl_alloc_array_1d)

```

@maleadt , Is there a reason why a view created by `selectdim` shouldn’t work within a kernel?

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [May 26, 2023, 10:06am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/16 "2023-05-26T10:06:52Z")

</div>

Not that I know; SubArrays of CuDeviceArrays should generally be supported. Please include the full backtrace, and make sure the code is type stable first.

---

<div class="post-metadata">

### Author: ![weymouth](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/weymouth/32/15839_2.png) [@weymouth](https://discourse.julialang.org/u/weymouth)
#### Post date: [May 26, 2023, 10:41am UTC](https://discourse.julialang.org/t/n-dimensional-view-into-an-n-1-dimension-array/99345/17 "2023-05-26T10:41:10Z")

</div>

I’ll work on a MWE.
