【问题标题】:"In" operator for numpy arrays?numpy数组的“In”运算符?
【发布时间】:2016-09-12 14:35:12
【问题描述】:

如何对 numpy 数组执行“in”操作? (如果给定的 numpy 数组中存在元素,则返回 True)

对于字符串、列表和字典,功能直观易懂。

这是我将其应用于 numpy 数组时得到的结果

a
array([[[2, 3, 0],
    [1, 0, 1]],

   [[3, 2, 0],
    [0, 1, 1]],

   [[2, 2, 0],
    [1, 1, 1]],

   [[1, 3, 0],
    [2, 0, 1]],

   [[3, 1, 0],
    [0, 2, 1]]])

b = [[3, 2, 0],
    [0, 1, 1]]

b in a
True
#Aligned with the expectation

c = [[300, 200, 0],
    [0, 100, 100]]

c in a
True
#Not quite what I expected

【问题讨论】:

  • 对于一维数组有一个np.in1d,但将其应用于二维数组的行需要一些技巧。查看它的代码以了解其中涉及的内容。

标签: python arrays numpy operators


【解决方案1】:

您可以比较equality 的输入数组,这将对a 中最后两个轴中每个位置的所有元素与第二个数组中相应位置的元素进行broadcasted 比较。这将产生一个布尔匹配数组,我们在其中检查最后两个轴上的 ALL 匹配,最后检查 ANY 匹配,就像这样 -

((a==b).all(axis=(1,2))).any()

示例运行

1) 输入:

In [68]: a
Out[68]: 
array([[[2, 3, 0],
        [1, 0, 1]],

       [[3, 2, 0],
        [0, 1, 1]],

       [[2, 2, 0],
        [1, 1, 1]],

       [[1, 3, 0],
        [2, 0, 1]],

       [[3, 1, 0],
        [0, 2, 1]]])

In [69]: b
Out[69]: 
array([[3, 2, 0],
       [0, 1, 1]])

2) 广播元素比较:

In [70]: a==b
Out[70]: 
array([[[False, False,  True],
        [False, False,  True]],

       [[ True,  True,  True],
        [ True,  True,  True]],

       [[False,  True,  True],
        [False,  True,  True]],

       [[False, False,  True],
        [False, False,  True]],

       [[ True, False,  True],
        [ True, False,  True]]], dtype=bool)

3) ALL 匹配最后两个轴,最后匹配 ANY

In [71]: (a==b).all(axis=(1,2))
Out[71]: array([False,  True, False, False, False], dtype=bool)

In [72]: ((a==b).all(axis=(1,2))).any()
Out[72]: True

a 中对c 执行类似的步骤-

In [73]: c
Out[73]: 
array([[300, 200,   0],
       [  0, 100, 100]])

In [74]: ((a==c).all(axis=(1,2))).any()
Out[74]: False

【讨论】:

  • 感谢您的拯救!所以没有像“in”这样直接的方法来检查 numpy 数组的存在吗?
  • @akilat90 恐怕没有。或者只是将它包装成一个函数,然后就可以了,这是一种定制的straightforward 方式!
【解决方案2】:

这个问题已经相当老了,但如果你和我一样,你可能会认为 in 没有 numpy 等效项。

Numpy 1.13 于 2017 年发布,随之而来的是 isin() 函数,现在很好地解决了这个问题:

import numpy as np

a = np.array([[[2, 3, 0],
               [1, 0, 1]],
              [[3, 2, 0],
               [0, 1, 1]],
              [[2, 2, 0],
               [1, 1, 1]],
              [[1, 3, 0],
               [2, 0, 1]],
              [[3, 1, 0],
               [0, 2, 1]]])

b = [[3, 2, 0],
     [0, 1, 1]]

print np.isin(b,a)

# [[ True  True  True]
#  [ True  True  True]]

c = [[300, 200, 0],
    [0, 100, 100]]

print np.isin(c,a)

# [[False False  True]
#  [ True False False]]

如果您要在测试数组中查找整个元素,您可能希望在最后使用 np.all()。

【讨论】:

  • 非常感谢!
【解决方案3】:

由于我没有足够的声誉来发表评论,但@rp0 使用 np.isin 然后 np.all 建议的答案不适用于 numpy 数组。 反例:

a = np.array([[[2, 3, 0],
               [1, 0, 1]],
              [[3, 2, 0],
               [0, 1, 1]],
              [[2, 2, 0],
               [1, 1, 1]],
              [[1, 3, 0],
               [2, 0, 1]],
              [[3, 1, 0],
               [0, 2, 1]]])
b = [[3, 2, 0],
     [0, 1, 1]]

c = [[3, 3, 3],
     [3, 3, 3]]

print(np.isin(b,a))
[[ True  True  True]
 [ True  True  True]]

print(np.isin(c,a))
[[ True  True  True]
 [ True  True  True]]

为了完整起见,我使用 tolist 将数组转换为 python 列表,然后使用普通的 'in' 运算符,它的工作方式与预期一样。

print(b in a.lolist())
True

print(c in a.tolist())
False

【讨论】:

    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多