简体   繁体   中英

Numpy - check if elements of a array belong to another array

I have 2 numpy arrays:

xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
y = np.array([1.1,1.2])

I want to check whether each element of xarr belongs to y or equals 1.3 . If an element belongs to y , return "y", if an element equals 1.3, return "y1", otherwise return "n"

I tried this:

x = np.where(xarr in y,"y",np.where(xarr == 1.3,"y1","n"))

but I got the wrong result, the first 2 elements should be "y" instead of "n"

['n' 'n' 'y1' 'n' 'n']

Don't know what I did wrong. Really appreciate any help

You can make use of numpy.in1d , the rest is pretty simple:

The key part:

In [25]: np.in1d(xarr, y)
Out[25]: array([ True,  True, False, False, False], dtype=bool)

Whole example:

In [16]: result = np.empty(len(xarr), dtype=object)

In [17]: result
Out[17]: array([None, None, None, None, None], dtype=object)

In [18]: result.fill("n")

In [19]: result
Out[19]: array(['n', 'n', 'n', 'n', 'n'], dtype=object)

In [20]: result[np.in1d(xarr, y)] = 'y'

In [21]: result
Out[21]: array(['y', 'y', 'n', 'n', 'n'], dtype=object)

In [23]: result[xarr == 1.3] = 'y1'

In [24]: result
Out[24]: array(['y', 'y', 'y1', 'n', 'n'], dtype=object)

Edit:

A small modification of your original attempt:

In [16]: x = np.where(np.in1d(xarr, y),"y",np.where(xarr == 1.3,"y1","n"))

In [17]: x
Out[17]: 
array(['y', 'y', 'y1', 'n', 'n'], 
      dtype='|S2')

The problem in your original attempt was that xarr in y gives just False .

Check np.isin() .

isin is an element-wise function version of the python keyword in .

isin(a, b) is roughly equivalent to np.array([item in b for item in a]) if a and b are 1-D sequences.

as per the update Numpy definition isin() should be used for new code. So Nirmal's answer should be upvoted.

https://numpy.org/doc/stable/reference/generated/numpy.in1d.html#numpy.in1d

We recommend using isin instead of in1d for new code.

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