# Slicing and boolean indexing in multidimensional arrays

**URL:** <https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522>\
**Category:** General Usage\
**Tags:** indexing, arrays, boolean\
**Created:** [June 29, 2022, 3:02pm UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522 "2022-06-29T15:02:29Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![bryce](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bryce/32/15193_2.png) [@bryce](https://discourse.julialang.org/u/bryce)\
**Post date:** [June 29, 2022, 3:02pm UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522/1 "2022-06-29T15:02:29Z")

</div>

I’m curious why the following 3D array slicing works for the i index but not for the j index:

```julia
T = Array(reshape(1:2*3*4, 2,3,4))
i = zeros(Bool, 2,3)
i[1,2:3] .= 1
display(T[i,:])
j = zeros(Bool, 3,4)
j[1,2:3] .= 1
display(T[:,j])

```

when the seemingly-analogous operation on a 2D array works either way:

```julia
M = Array(reshape(1:4*5, 4,5))
k = zeros(Bool, 4)
k[2:3] .= 1
display(M[k,:])
l = zeros(Bool, 5)
l[2:3] .= 1
display(M[:,l])

```

I’m interested in both why it doesn’t work, and any suggestions for a reasonably-elegant work-around.

---

<div class="post-metadata">

**Author:** ![fabiangans](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fabiangans/32/2624_2.png) [@fabiangans](https://discourse.julialang.org/u/fabiangans)\
**Post date:** [June 29, 2022, 4:06pm UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522/2 "2022-06-29T16:06:59Z")

</div>

I have no idea why it does not work but a “reasonably elegant workaround” might be:

```julia
jj = findall(j)
T[:,jj]

```

---

<div class="post-metadata">

**Author:** ![N5N3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/n5n3/32/17663_2.png) [@N5N3](https://discourse.julialang.org/u/N5N3)\
**Post date:** [June 29, 2022, 4:21pm UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522/3 "2022-06-29T16:21:41Z")

</div>

This should be a bug in `Base.to_indices`, more specific

```julia
@inline to_indices(A, inds, I::Tuple{Union{Array{Bool,N}, BitArray{N}}}) where {N} =
    (_maybe_linear_logical_index(IndexStyle(A), A, I[1]),)

```

It should be something like

```julia
@inline to_indices(A, inds, I::Tuple{Union{Array{Bool,N}, BitArray{N}}}) where {N} =
    ndims(A) == N ? (_maybe_linear_logical_index(IndexStyle(A), A, I[1]),) : (to_index(A, I[1]),)

```

---

<div class="post-metadata">

**Author:** ![bryce](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bryce/32/15193_2.png) [@bryce](https://discourse.julialang.org/u/bryce)\
**Post date:** [June 29, 2022, 5:22pm UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522/4 "2022-06-29T17:22:21Z")

</div>

Thanks, this does meet my needs for a workaround at the moment.

---

<div class="post-metadata">

**Author:** ![bryce](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bryce/32/15193_2.png) [@bryce](https://discourse.julialang.org/u/bryce)\
**Post date:** [June 29, 2022, 5:27pm UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522/5 "2022-06-29T17:27:16Z")

</div>

This seems very relevant, but I don’t fully understand it. Could you elaborate a bit on how your proposed update works? Are you planning to submit a bug-report about this?

---

<div class="post-metadata">

**Author:** ![N5N3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/n5n3/32/17663_2.png) [@N5N3](https://discourse.julialang.org/u/N5N3)\
**Post date:** [June 30, 2022, 5:21am UTC](https://discourse.julialang.org/t/slicing-and-boolean-indexing-in-multidimensional-arrays/83522/6 "2022-06-30T05:21:20Z")

</div>

On master, if `IndexStyle(A) === IndexLinear()`, `Base.to_indices` always transforms the last logical index into `Base.LogicalIndex{Int}`. Thus `T[:,j]` behaves as `T[:,findall(vec(j))]`, which is always not correct.  
The above change avoids the wrong optimization by adding a dimension check. I’ve open a [PR](https://github.com/JuliaLang/julia/pull/45869) to fix this.
