Home > Enterprise >  Numpy Check if an element is in array
Numpy Check if an element is in array

Time:05-19

I have an array c, another array d. how can I check if d[1]ord[3]ord[5]ord[7] is in array c?

c = np.array([[ 1, 1,0],
              [ 1,-1,0],
              [-1, 1,0],
              [-1,-1,0]])
d = np.array([[2,2,2],
              [1,1,0],
              [2,8,8],
              [6,8,8],
              [2,2,2],
              [4,9,0],
              [2,2,2],
              [3,2,2]])

I tried g = np.any(c == d[1,3,5,7]) ,but it doesn't work. In this case, the result should be True because [1,1,0] is in array c. Can anyone help me?

CodePudding user response:

As you are using numpy use the function isin that is defined:

enter image description here

EDIT: you changed the question, but the answer is equally valid. Here it is how to check all d in c: import numpy as np

c = np.array([[ 1, 1,0],
              [ 1,-1,0],
              [-1, 1,0],
              [-1,-1,0]])
d = np.array([[2,2,2],
              [1,1,0],
              [2,8,8],
              [6,8,8],
              [2,2,2],
              [4,9,0],
              [2,2,2],
              [3,2,2]])
for item in d:
  g = np.isin(item,c).all()
  print(g)

If you want a particular array in d use the formula without the for, just put d[0],denter image description here

CodePudding user response:

Try this

# to check if a row in its entirety match a list, 
# use all on axis=1 first, then check if any rows match using any
(c==[2,1,0]).all(1).any()
False

For multiple checks

# use bit-wise | (instead of or)
((c==[2,1,0]) | (c==[3,1,0]) | (c==[5,5,0])).all(1).any()

CodePudding user response:

The direct way should be to compare one by one:

any(any((i == j).all() for j in c) for i in d[1::2])

Or use one or two layers of Broadcasting:

any((c == i).all(-1).any() for i in d[1::2])
(c[:, None] == d[None, 1::2]).all(-1).any()

Using broadcast can calculate faster, but it must first calculate all the comparison results, and then check them with method ndarray.any, but loop check can reduce the number of comparisons.

In addition, np.isin can't meet your requirements. It only returns whether each element of first parameter is in the second parameter.

  • Related