Reputation: 939
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
Upvotes: 17
Views: 25305
Reputation: 31
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.
Upvotes: 2
Reputation: 86326
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
.
Upvotes: 23