# Remove zeros from a 3D array

50 views (last 30 days)
Uerm on 3 Feb 2020
Commented: Uerm on 10 Feb 2020
Hi,
I have a 3D array A = 90x38021x1633. The second dimension (38021) contains a lot of zeros as I have done zero padding before concatenating multiple 3D arrays to get A. How can I now remove these zeros such that B = 90xYx1633, where Y < 38021?
Thanks!

the cyclist on 3 Feb 2020
Edited: the cyclist on 3 Feb 2020
Do you mean you have "slices" of all zeros? Then this should work:
% Create an array like your A matrix, where some "slices" of data is all zeros
A = repmat([0 0 0 0; 1 0 0 0; 1 0 1 0],[1 1 5]);
% Find indices to slices in the 1-3 plane that have any non-zeros.
idx = any(A ~= 0,[1 3]);
% Create B from only the slices that have non-zeros
B = A(:,idx,:);
Just use your A, instead of the pretend one I made. Also, you can combine the two steps by just doing
B = A(:,any(A ~= 0,[1 3]),:);
but I wanted to call out explicitly what is going on.

Nils Speetzen on 3 Feb 2020
Hi,
I assume you want to remove rows/planes containing only zeros. To find these, you can use
all(A==0, [1 3])
This searches for all planes where all entries along the first and third dimension are equal to zero.
To remove all those rows/planes, you can directly index A via this expression:
A(:,all(A==0, [1 3]),:) = []
I hope this helps!

Uerm on 3 Feb 2020
Hi, the point with the zero padding is to concatenate the 3D arrays into one 3D array. I want to remove these zeros after I have concatenated the arrays. The reason for this is that I will use this 3D array to calculate some features which are to be used for classification (machine learning). These added zeros will therefore have an influence on the calculated features.
Will it be a better idea to have the second dimension be equal to the shortest one for the 3D arrays before I concatenate them?
the cyclist on 3 Feb 2020
I'm not certain I fully understand, but I am getting some idea. Again, looking at just some small arrays as examples.
So maybe you had an array A1:
A1 = [1 2 0;
3 4 5];
And you have another array A2:
A2 = [5 6 7;
8 9 0];
And you end up with A by concatenating A1 and A2 along the third dimension:
A = cat(3,A1,A2)
A(:,:,1) =
1 2 0
3 4 5
A(:,:,2) =
5 6 7
8 9 0
So A has some data where the zeros are not meaningful, and are just placeholders.
But, repeating my prior comment, you CANNOT just "remove" them. A matrix cannot have an "empty" spot.
You could do
A(A==0) = NaN
A(:,:,1) =
1 2 NaN
3 4 5
A(:,:,2) =
5 6 7
8 9 NaN
which replaces the zeros with NaN (not-a-number). You might then be able to do later steps in your calculation. Does that help?
Uerm on 10 Feb 2020
Thanks a lot for your help! It makes sense now.

R2019b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!