Numpy 检查元素是否在数组中

Numpy Check if an element is in array

我有一个数组 c,另一个数组 d。如何检查 d[1]ord[3]ord[5]ord[7] 是否在数组 c?

c = np.array([[ 1, 1,0],
              [ 1,-1,0],
              [-1, 1,0],
              [-1,-1,0]])
d = np.array([[2,2,2],
              [1,1,0],
              [2,8,8],
              [6,8,8],
              [2,2,2],
              [4,9,0],
              [2,2,2],
              [3,2,2]])

我试过了 g = np.any(c == d[1,3,5,7]),但是没用。在这种情况下,结果应该是 True,因为 [1,1,0] 在数组 c 中。谁能帮帮我?

试试这个

# to check if a row in its entirety match a list, 
# use all on axis=1 first, then check if any rows match using any
(c==[2,1,0]).all(1).any()
False

多次检查

# use bit-wise | (instead of or)
((c==[2,1,0]) | (c==[3,1,0]) | (c==[5,5,0])).all(1).any()

当您使用 numpy 时,请使用定义的函数 isin

https://numpy.org/doc/stable/reference/generated/numpy.isin.html

g = np.isin([ 2, 1,0],c)

编辑:正如@Phoenix 建议进行所有矢量检查,您需要在末尾添加所有 g = np.isin([ 2, 1,0],c).all() this return False。在协作中测试:

编辑:您更改了问题,但答案同样有效。这是检查 c 中所有 d 的方法: 将 numpy 导入为 np

c = np.array([[ 1, 1,0],
              [ 1,-1,0],
              [-1, 1,0],
              [-1,-1,0]])
d = np.array([[2,2,2],
              [1,1,0],
              [2,8,8],
              [6,8,8],
              [2,2,2],
              [4,9,0],
              [2,2,2],
              [3,2,2]])
for item in d:
  g = np.isin(item,c).all()
  print(g)

如果你想要 d 中的特定数组使用不带 for 的公式,只需输入 d[0]、d1 等....而不是项目...... Google colab 测试:

直接的方法应该是一个一个比较:

any(any((i == j).all() for j in c) for i in d[1::2])

或者使用一层或两层广播:

any((c == i).all(-1).any() for i in d[1::2])
(c[:, None] == d[None, 1::2]).all(-1).any()

使用broadcast可以计算的更快,但是必须先计算出所有的比较结果,然后用方法ndarray.any进行校验,但是循环校验可以减少比较的次数

另外,np.isin无法满足您的要求。只returns第一个参数的每个元素是否在第二个参数中