Wow...found lot of useful functions in cbook :) great thanks for the pointer.

As for this case, I think the masks must be broadcasted together with data, if broadcasted separately, the outcome mask and data will not match each other in some scenario, consider:

    arrays = [
        np.ma.array([1, 2, 3], mask=[1, 0, 0]),
        np.array([[4, 5, 6], [7, 8, 9]])
    ]

Line 2522-2526 is to address this scenario.

When picking the elements, the approach I used here happened to be very similar to `delete_masked_points()`, the main difference is `delete_masked_points()` is doing `and` to reduce the mask, here I am doing `or` to reduce the mask. I think it make sense to do so, if I use `and` here, the input parameter will need to make sure all `u,v,w,x,y,z` masked in the same spot after broadcasting in order for a position to be masked; using `or`, the user can simply mask any of the `u,v,w,x,y,z` and knowing the position is masked no matter if the mask matches or not after broadcasting in rest of parameters. If one got multiple masks and feel confused, one can simply strip all the masks and only mask on one parameter.

Different than `delete_masked_points()`, here since I know that the arrays and mask are in same shape, I can simply apply the mask and use `compressed()` to get rid of the masked elements without additional checking like `delete_masked_points()` needed. Also I get the added benefit of being able to handle masked array of more than 1-D.