Reputation: 53
for example if i have:
import numpy as np
A = np.array([[2,3,4],[5,6,7]])
and i want to check if the following list is the same as one of the lists that the array consist of:
B = [2,3,4]
I tried
B in A #which returns True
But the following also returns True, which should be false:
B = [2,2,2]
B in A
Upvotes: 5
Views: 199
Reputation: 411
Straight forward, you could use any()
to go through a generator comparing the arrays with array_equal
.
from numpy import array_equal
import numpy as np
A = np.array([[2,3,4],[5,6,7]])
B = np.array([2,2,4])
in_A = lambda x, A : any((array_equal(a,x) for a in A))
print(in_A(B, A))
False
[Program finished]
Upvotes: 0
Reputation: 7111
Try this generator comprehension. The builtin any()
short-circuits so that you don't have extra evaluations that you don't need.
any(np.array_equal(row, B) for row in A)
For now, np.array_equal
doesn't implement internal short-circuiting. In a different question the performance impact of different ways of accomplishing this is discussed.
As @Dan mentions below, broadcasting is another valid way to solve this problem, and it's often (though not always) a better way. For some rough heuristics, here's how you might want to choose between the two approaches. As with any other micro-optimization, benchmark your results.
B==A
)A
is B
, we don't have to look at the rest)A
(i.e. if more often than not we expect B
to not be in A
), broadcasting will almost always be faster (not always a lot faster necessarily, see next point)Upvotes: 6
Reputation: 4506
list((A[[i], :]==B).all() for i in range(A.shape[0]))
[True, False]
This will tell you what row of A
is equal to B
Upvotes: 0
Reputation: 45741
You can do it by using broadcasting like this:
import numpy as np
A = np.array([[2,3,4],[5,6,7]])
B = np.array([2,3,4]) # Or [2,3,4], a list will work fine here too
(B==A).all(axis=1).any()
Upvotes: 3
Reputation: 39042
You need to use .all()
for comparing all the elements of list.
A = np.array([[2,3,4],[5,6,7]])
B = [2,3,4]
for i in A:
if (i==B).all():
print ("Yes, B is present in A")
break
EDIT: I put break
to break out of the loop as soon as the first occurence is found. This applies to example such as A = np.array([[2,3,4],[2,3,4]])
# print ("Yes, B is present in A")
Alternative solution using any
:
any((i==B).all() for i in A)
# True
Upvotes: 0
Reputation: 28437
Using the built-in any
. As soon as an identical element is found, it stops iterating and returns true.
import numpy as np
A = np.array([[2,3,4],[5,6,7]])
B = [3,2,4]
if any(np.array_equal(B, x) for x in A):
print(f'{B} inside {A}')
else:
print(f'{B} NOT inside {A}')
Upvotes: 1