17

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

1

3 Answers 3

23

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.

Sign up to request clarification or add additional context in comments.

Comments

5

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.

Comments

2

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.

1 Comment

This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

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.