亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

測試 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 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號