为了账号安全,请及时绑定邮箱和手机立即绑定

测试 numpy 数组是否是 numpy 数组列表的成员,并将其从列表中删除

测试 numpy 数组是否是 numpy 数组列表的成员,并将其从列表中删除

HUWWW 2021-07-27 13:43:44
测试 numpy 数组是否为 numpy 数组c列表的成员时CNTS:import numpy as npc = np.array([[[ 75, 763]],              [[ 57, 763]],              [[ 57, 749]],              [[ 75, 749]]])CNTS = [np.array([[[  78, 1202]],                  [[  63, 1202]],                  [[  63, 1187]],                  [[  78, 1187]]]),        np.array([[[ 75, 763]],                  [[ 57, 763]],                  [[ 57, 749]],                  [[ 75, 749]]]),        np.array([[[ 72, 742]],                  [[ 58, 742]],                  [[ 57, 741]],                  [[ 57, 727]],                  [[ 58, 726]],                  [[ 72, 726]]]),        np.array([[[ 66, 194]],                  [[ 51, 194]],                  [[ 51, 179]],                  [[ 66, 179]]])]print(c in CNTS)我得到:ValueError:包含多个元素的数组的真值不明确。使用 a.any() 或 a.all()然而,答案相当明确:c正是CNTS[1],所以c in CNTS应该返回 True!如何正确测试 numpy 数组是否是 numpy 数组列表的成员?删除时会发生同样的问题:CNTS.remove(c)ValueError:包含多个元素的数组的真值不明确。使用 a.any() 或 a.all()应用程序:测试opencv轮廓(numpy 数组)是否是轮廓列表的成员,例如参见Remove an opencv contour from a list of contours。
查看完整描述

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]


查看完整回答
反对 回复 2021-08-03
?
12345678_0001

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]]])]


查看完整回答
反对 回复 2021-08-03
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号