首先,很抱歉,如果这实际上是重复的操作-我花了最后三个小时尝试解决此问题,但找不到任何解决方案。
我正在使用列表将坐标表示为[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
是
答案 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