在两种情况下都返回True,当它包含一个元素时,何时不包含。为什么?

时间:2015-03-29 17:18:55

标签: python multidimensional-array

假设我创建了一个整数2d数组:

import numpy as np
ar1 = np.random.randint(10, size=(4,2))
v1 = ar1[0]
v2 = [4,4]
ar1 = np.array([[5, 7],
                [7, 5],
                [9, 2],
                [0, 1]])

我想检查v1和v2是否是ar1的元素。 “元素”我的意思是“行”:

v1 in ar1
v2 in ar1

在这两种情况下我得到True。我究竟做错了什么?有没有更好的方法来检查向量是否匹配数组的行?循环遍历行(即for rows in ar1:)不是一种选择。

编辑:另一种方法是在每一行中对匹配值求和并检查总和是否为2,但它是跛脚和unpythonic

2 个答案:

答案 0 :(得分:2)

您可以将np.anynp.all一起使用条件。您要检查的必须为broadcastable - Array Broadcasting in numpy

import numpy as np
v1 = np.array([9,2])
v2 = np.array([2,9])
v3 = np.array([9,4])
ar1 = np.array([[5, 7],
                [7, 5],
                [9, 2],
                [0, 1]])

>>> ar1 == v1
array([[False, False],
       [False, False],
       [ True,  True],
       [False, False]], dtype=bool)
>>> ar1 == v2
array([[False, False],
       [False, False],
       [False, False],
       [False, False]], dtype=bool)
>>> ar1 == v3
array([[False, False],
       [False, False],
       [ True, False],
       [False, False]], dtype=bool)
>>> np.any(np.all(ar1 == v1 , axis = 1)), np.any(np.all(ar1 == v2, axis = 1)), np.any(np.all(ar1 == v3, axis = 1))
(True, False, False)
>>>     

答案 1 :(得分:1)

如果它们是列表而不是numpy数组,那么这将有效。

ar1 = np.array([[5, 7],
                [7, 5],
                [9, 2],
                [0, 1]])

[7, 5] in ar1 ## True
[7, 6] in ar1 ## True

[7, 5] in ar1.tolist() ## True
[7, 6] in ar1.tolist() ## False