arraysjulia

Drop Julia array dimensions of length 1

Say if I have a 5D Array with size 1024x1024x1x1x100. How can I make a new array that is 1024x1024x100?

The following works if you know which dimensions you want to keep ahead of time:

``````arr = arr[:, :, 1, 1, :]
``````

But I don't know which dimensions are what size ahead of time and I would like to only keep dimensions given a boolean mask; something like this...

``````arr2 = arr[(size(arr) .> 1)]
``````

Solution

• The `squeeze` function was defined specifically for the purpose of removing dimensions of length 1. From the manual:

Base.squeeze — Function.

`squeeze(A, dims) `

Remove the dimensions specified by dims from array A. Elements of dims must be unique and within the range `1:ndims(A)`. `size(A,i)` must equal 1 for all `i` in `dims`.

To "squeeze" all the dimensions of size 1 (when they are unknown in advance), we need to find them and make them into a tuple. This is accomplished by `((size(arr).==1)...)`. So the result is:

``````squeeze(a,(find(size(a).==1)...))
``````

Thanks to a comment by Olivier, here is an:

UPDATE: `dropdims` is now (Julia 1.9 as of writing) the preferred way to squeeze out size 1 dimensions. For example, to drop all the size 1 dimensions from M:

``````dropdims(M,dims=tuple(findall(size(M).==1)...))
``````

If the dimensions are known, then it might be better to specify them explicitly instead of using the above `findall` method.