Mask 3d array with 2d mask in numpy

I have a 3-dimensional array that I want to hide using a 2-dimensional array, which has the same dimensions as the two right-most of the three-dimensional array. Is there a way to do this without writing the next loop?

import numpy as np nx = 2 nt = 4 field3d = np.random.rand(nt, nx, nx) field2d = np.random.rand(nx, nx) field3d_mask = np.zeros(field3d.shape, dtype=bool) for t in range(nt): field3d_mask[t,:,:] = field2d > 0.3 field3d = np.ma.array(field3d, mask=field3d_mask) print field2d print field3d 
+6
source share
2 answers

Without a loop, you can write it as:

 field3d_mask[:,:,:] = field2d[np.newaxis,:,:] > 0.3 

For instance:

 field3d_mask_1 = np.zeros(field3d.shape, dtype=bool) field3d_mask_2 = np.zeros(field3d.shape, dtype=bool) for t in range(nt): field3d_mask_1[t,:,:] = field2d > 0.3 field3d_mask_2[:,:,:] = field2d[np.newaxis,:,:] > 0.3 print((field3d_mask_1 == field3d_mask_2).all()) 

gives:

True

+6
source

Here is numpy.broadcast_to (new in Numpy 1.10.0):

 field3d_mask = np.broadcast_to(field2d > 0.3, field3d.shape) 
+5
source

All Articles