Skip to content
Advertisement

Replace all non-intersecting values with 0, between two numpy arrays

Say I have a multi-dimensional array, for example:

a = array([[[86, 27],
    [26, 59]],

   [[ 1, 16],
    [46,  5]],

   [[71, 85],
    [ 6, 71]]])

And say I have a one-dimensional array (b), with some values which may be seen in my multi-dimensional array (a):

b = [26, 16, 6, 71]

Now I want to replace all of the non-intersecting values in array a with zero. I want to get the following result:

a = array([[[0, 0],
    [26, 0]],

   [[ 0, 16],
    [ 0,  0]],

   [[71, 0],
    [ 6, 71]]])

How could I achieve this?

I tried several ways of coding which didn’t work. I expected the following line to work, but I think there is an issue with using not in in this format:

a = np.where(a not in b, int(0), a)

I get the following error when I try this:

arr = np.where(arr not in required_intensities, int(0), arr) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

I am unsure what to try next. Any ideas?

Advertisement

Answer

np.isin() is perfect for this:

a[~np.isin(a, b)] = 0

Output:

>>> a
array([[[ 0,  0],
        [26,  0]],

       [[ 0, 16],
        [ 0,  0]],

       [[71,  0],
        [ 6, 71]]])
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement