尝试从列表中删除数组时,为什么会出现此错误?

时间:2016-02-15 18:00:05

标签: python arrays

我有一个列表,每个元素都是一个数组数组。像这样:

contourList = [  [ [x0,y0],[x1,y1]...] ,[ [x2,y2],[x3,y3] ]...]

每个列表元素都是一个坐标数组,表示x-y维度的轮廓,每个坐标是一个长度为2的数组,表示x,y值。

现在我想检查一个给定的轮廓"数组数组"存在于此列表中,如果是,则将其删除。当我这样做时,我收到一个错误:

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

这是代码:

for contour in contourList:
    if equalCoords(contour, mycontour):
        contourList.remove(contour)

我使用这种方法" equalCoords来检查2个轮廓是否相同。它是:

def equalCoords(contourA,contourB):
    if len(contourA)!=len(cylinderB):
        return False
    else:
        for contourCoordA,contourCoordB in zip(contourA,contourB):
            if contourCoordA[0]!=contourCoordB[0] or contourCoordA[1]!=contourCoordB[1]:
                return False
    return True

以下是轮廓的示例:

[[ 240.0696526   413.        ]
 [ 241.          412.31021016]
 [ 241.57079161  412.        ]
 [ 242.          411.77849971]
 [ 243.          411.41933059]
 [ 244.          411.21092001]
 [ 245.          411.13343726]
 [ 246.          411.1804759 ]
 [ 247.          411.35514159]
 [ 248.          411.6721164 ]
 [ 248.68715031  412.        ]
 [ 249.          412.15537894]
 [ 250.          412.82438379]
 [ 250.20954831  413.        ]]

代码工作正常并成功删除了一些轮廓,但经过一些迭代后它停止并给出了我上面提到的错误。

如果我的问题不够明确,请告诉我。

1 个答案:

答案 0 :(得分:2)

我想问题是当你remove查找等于contour的项目,但是contour是一个列表时,它会在内部检查是否list1==list2,导致此错误。因此,您可以使用pop代替,或使用列表推导。

你可以这样做:

i = 0
while i < len(contourList):
  if equalCoords(contourList[i], mycontour):
    contourList.pop(i)
  else:
    i += 1

或者:

contourList = [c for c in contourList if not equalCoords(c, mycontour)]

或者:

contourList = filter(lambda c: not equalCoords(c, mycontour), contourList)