我对np.select有些麻烦:
s=np.array([False,True],dtype=bool)
v=np.array([np.array([1,2]),np.array([3])])
np.select(s,v)
返回
array([3, 3])
这对我来说并不清楚。而且,如果我用v
替换
v=np.array([np.array([1,2]),np.array([3,4,5])])
我收到一个错误。这显然是由于v
的变量类型,因为当v
是整数数组或具有相似长度的数组数组(矩阵)时它很有效。那么为什么它在我的情况下不起作用?我正在寻找一个很好的方法来解决它(没有for循环)。
(我想用contours
和hierarchy
(cv.findContours
输出)使用这种代码,我已经把上面的难度分开了。不幸的是,每个轮廓的长度不一样......)
np.select
docs讨论了列出的两个论点。如果它们是数组,则将它们视为列表,迭代第一维。
In [112]: np.select([False,True],[np.array([1,2]), np.array([3,3])])
Out[112]: array([3, 3])
显然,如果列表中的数组形状不同,它会尝试将它们一起广播。在这种情况下,公共广播形状是(2,)。所以扩展了布尔条件:
[False,True]
[np.array([False,False]),np.array([True,True])]
同样,你的第一个例子是np.array([3])
广播到我上面使用的(2,)。
In [113]: np.select([False,True],[np.array([1,2]), np.array([3])])
Out[113]: array([3, 3])
但是当其中一个阵列具有形状(3,)时,广播不再可能:
In [114]: np.select([False,True],[np.array([1,2]), np.array([3,4,5])])
---------------------------------------------------------------------------
/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in select(condlist, choicelist, default)
699 # for example when all choices are scalars.
700 condlist = np.broadcast_arrays(*condlist)
--> 701 choicelist = np.broadcast_arrays(*choicelist)
702
703 # If cond array is not an ndarray in boolean format or scalar bool, abort.
....
ValueError: shape mismatch: objects cannot be broadcast to a single shape
简而言之,condlist
和choicelist
必须是相等的长度,这些列表中的所有元素必须是可以相互广播的数组。输出将是具有该常见广播形状的阵列。
np.select
没有被广泛使用。我怀疑在你的情况下,使用参差不齐,不可广播的数组,它没用。