Numpy - 检查数组元素是否属于另一个数组

16

我有两个numpy数组:

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

我希望检查xarr的每个元素是否属于y或等于1.3。如果一个元素属于y,则返回“y”,如果一个元素等于1.3,则返回“y1”,否则返回“n”。

我尝试过这样:

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

但是我得到了错误的结果,前两个元素应该是“y”,而不是“n”。

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

不知道我做错了什么,非常感激任何帮助。


1
in对于NumPy数组来说是可怕的。x in y几乎就是(x == y).any(),无论这是否有意义。 - user2357112
3个回答

22
你可以使用 numpy.in1d,其余部分非常简单:

关键部分:

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

整个例子:

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)

编辑:

对您原来的尝试进行了小的修改:

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')
您原始尝试中的问题在于xarr in y仅返回False

4

请查看np.isin()

isin是Python关键字in的逐元素函数版本。

如果ab是1-D序列,则isin(a, b)大致相当于np.array([item in b for item in a])


1

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - srishtigarg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接