0

I have a matrix x_faces with 3 columns and N elements (in this example 4). Per row I want to know if it contains any of the elements from array matches

x_faces = [[   0,  43, 446],
           [   8,  43, 446],
           [   0,  10, 446],
           [   0,   5, 425]
          ]
matches = [8, 10, 44, 425, 440]

Which should return this:

results = [
        False,
        True,
        True,
        True
    ]

I can think of a for loop that does this, but is there a neat way to do this in python?

1
  • I found a faster way: np.any(np.in1d(x_faces, matches[i]).reshape(-1,3), axis=1) Commented Apr 5, 2016 at 14:39

3 Answers 3

2

You could use any() function for that purpose:

result = [any(x in items for x in matches) for items in x_faces]

Output:

[False, True, True, True]
Sign up to request clarification or add additional context in comments.

3 Comments

Is this internally really different from a for-loop? Does list comprehension do some magis to be more effective additionaly to more good-looking? Edit: ah, the thing inside the any is a generator expression, right?
I think you should link to any in Python3 version instead
Thanks, the any() function was what I was looking for
0

You can use numpy and convert both arrays to 3D and compare them. Then I use sum to determine, whether any of the values in the last two axis is True:

x_faces = np.array([[   0,  43, 446],
           [   8,  43, 446],
           [   0,  10, 446],
           [   0,   5, 425]
          ])
matches = np.array([8, 10, 44, 425, 440])
shape1, shape2 = x_faces.shape, matches.shape
x_faces = x_faces.reshape((shape1 + (1, )))
mathes = matches.reshape((1, 1) + shape2)
equals = (x_faces == matches)
print np.sum(np.sum(equals, axis=-1), axis=-1, dtype=bool)

1 Comment

maybe :) depends on the size, doesn't it. I thought, that what you do is in effect a for loop, and he asked for something else :)
0

I would do something like:

result = [any([n in row for n in matches]) for row in x_faces]

1 Comment

Generator expressions are best suited in cases like this. Take a look at this SO post, and this post any()+generator expression. Also, in this I tried to explain why generator expression is better in cases like this than list comprehensions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.