检查列表是否不包含列表

时间:2018-10-31 17:44:01

标签: python python-2.7 opencv

首先,很抱歉,如果这实际上是重复的操作-我花了最后三个小时尝试解决此问题,但找不到任何解决方案。

问题

我正在使用列表将坐标表示为[x, y]。我想找出坐标列表是否不包含指定坐标。例如,如果我有坐标[[3.3, 4.4], [5.5, 6.6]]和坐标[1.1, 2.2]的列表,我希望返回True,因为坐标不在坐标列表中。

可能值得注意的是,坐标列表是使用OpenCV函数cv2.findContours()cv2.minAreaRect(),最后是cv2.boxPoints()生成的,它会生成列表列表。这些坐标存储在字典中并从那里访问;调用坐标print()会给我坐标[array([3.3, 4.4], dtype=float32), array([5.5, 6.6], dtype=float32)]的格式,而不是[[3.3, 4.4], [5.5, 6.6]]格式,而print()是在我用{{ {1}}。

我尝试过的

我尝试使用this question的答案,但出现错误cv2.boxPoints()

该尝试的代码如下:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

然后我尝试使用this question about a.all()的答案,但遇到相同的错误。

该尝试的代码如下:

for coordinate in box:
    if coordinate not in specialCoordinates:
        # operations go here

我也尝试过:

for coordinate in box:
    if not all(coordinate == special for special in specialCoordinates):
        # operations go here

其他信息

当我在Python 2.7解释器中尝试以下操作时,上述for coordinate in box: if all(coordinate != special for special in specialCoordinates): # operations go here 格式会起作用:

win32上的Python 2.7.15(v2.7.15:ca079a3ea3,2018年4月30日,16:30:26)[MSC v.1500 64位(AMD64)]

输入“帮助”,“版权”,“信用”或“许可证”以获取更多信息。

>>> a = [[3.3,4.4],[5.5,6.6]]

>>> b = [1.1,2.2]

>>> b不在a

2 个答案:

答案 0 :(得分:0)

这里的主要问题是列表中的numpy数组元素具有与之关联的精度,例如: a = [np.array([3.3, 4.4], dtype='float32'), np.array([5.5, 6.6], dtype='float32')] 等效于: [array([ 3.29999995, 4.4000001 ], dtype=float32), array([ 5.5 , 6.5999999], dtype=float32)]

因此,如果您在a中寻找[3.3,4.4],它就不会出现,因此您可能需要提高精度或进行一些转换。

答案 1 :(得分:0)

import numpy as np
#a = [array([3.3, 4.4]), array([5.5, 6.6])]
a = np.array([i.tolist() for i in a])

def if_not_in_a(A, B):
    for i in A:
        if np.linalg.norm(i - B) == 0: 
        #you can use tolerance like < 1e-2 to avoid floating point complicacy
            return False
    return True

print(if_not_in_a(a, np.array([1.1, 2.2])))
#prints True

print(if_not_in_a(a, np.array([3.3, 4.4])))
#prints False