【发布时间】:2019-04-03 13:12:37
【问题描述】:
当测试一个 numpy 数组 c 是否是一个 numpy 数组 CNTS 列表的成员时:
import numpy as np
c = 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。
【问题讨论】:
-
@DavidG 真正的问题(对于application)不仅是测试成员资格,而且还从 numpy 数组列表中删除了一个 numpy 数组,我在问题中添加了更多细节。这不是真正的重复。
-
我觉得你可以用
bool(sum((map(lambda x: np.array_equal(x,c), CNTS)))) -
@RudolfMorkovskyi。你可以只使用
any,它也会造成短路 -
所有数组的大小都一样吗?
-
@MadPhysicist 不,那些数组是contours,即点列表,可以是矩形(4 个点)、五边形(5 个点)等。