3 回答

TA贡献1777条经验 获得超3个赞
你所得到的错误,因为in本质上调用bool(c == x)每一个元素上x的CNTS。这__bool__是引发错误的转换:
>>> c == CNTS[1]
array([[[ True, True]],
[[ True, True]],
[[ True, True]],
[[ True, True]]])
>>> bool(_)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这同样适用于删除,因为它测试每个元素的相等性。
遏制
解决方案是对每个比较使用np.array_equal或应用该all方法:
any(np.array_equal(c, x) for x in CNTS)
要么
any((c == x).all() for x in CNTS)
移动
要执行删除,您对元素的索引比它的存在更感兴趣。我能想到的最快方法是迭代索引,使用 的元素CNTS作为比较键:
index = next((i for i, x in enumerate(CNTS) if (c == x).all()), -1)
这个选项可以很好地短路,并-1作为默认索引返回而不是提高StopIteration. 您可以删除的说法-1来next,如果你喜欢的错误。如果您愿意,可以替换(c == x).all()为np.array_equal(c, x).
现在您可以像往常一样删除:
del CNTS[index]

TA贡献1802条经验 获得超5个赞
使用del删除您想删除列表中的索引。
del CNTS[int(np.where(list(np.array_equal(row, c) for row in CNTS))[0])]
CNTS
[array([[[ 78, 1202]],
[[ 63, 1202]],
[[ 63, 1187]],
[[ 78, 1187]]]), array([[[ 72, 742]],
[[ 58, 742]],
[[ 57, 741]],
[[ 57, 727]],
[[ 58, 726]],
[[ 72, 726]]]), array([[[ 66, 194]],
[[ 51, 194]],
[[ 51, 179]],
[[ 66, 179]]])]
添加回答
举报