简体   繁体   中英

Check if each element in a numpy array is in a separate list

I'd like to do something like this:

>>> y = np.arange(5)
>>> y in (0, 1, 2)
array([True, True, True, False, False])

This syntax doesn't work. What's the best way to achieve the desired result?

(I'm looking for a general solution. Obviously in this specific case I could do y < 3 .)

I'll spell this out a little more clearly for you guys, since at least a few people seem to be confused.

Here is a long way of getting my desired behavior:

new_y = np.empty_like(y)
for i in range(len(y)):
    if y[i] in (0, 1, 2):
        new_y[i] = True
    else:
        new_y[i] = False

I'm looking for this behavior in a more compact form.

Here's another solution:

new_y = np.array([True if item in (0, 1, 2) else False for item in y])

Again, just looking for a simpler way.

A good general purpose tool is a broadcasted, or 'outer', comparison between elements of two arrays:

In [35]: y=np.arange(5)                                                         
In [36]: x=np.array([0,1,2])                                                    
In [37]: y[:,None]==x                                                           
Out[37]: 
array([[ True, False, False],
       [False,  True, False],
       [False, False,  True],
       [False, False, False],
       [False, False, False]])

This is doing a fast comparison between every element of y and every element of x . Depending on your needs, you can condense this array along one of the axes:

In [38]: (y[:,None]==x).any(axis=1)                                             
Out[38]: array([ True,  True,  True, False, False])

A comment suggested in1d . I think it's a good idea to look at its code. It has several strategies depending on the relative sizes of the inputs.

In [40]: np.in1d(y,x)                                                           
Out[40]: array([ True,  True,  True, False, False])
In [41]: np.array([True if item in x else False for item in y])                 
Out[41]: array([ True,  True,  True, False, False])

Which is fastest may depend on the size of the inputs. Starting lists your list comprehension might be faster. This pure list version is by far the fastest:

[True if item in (0,1,2) else False for item in (0,1,2,3,4)] 
[item in (0,1,2) for item in (0,1,2,3,4)]    # simpler

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM