我在使用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
输出一起使用),我已经隔离了上面的困难。不幸的是,每个轮廓的长度都不相同...)
答案 0 :(得分:0)
np.select
文档讨论了列出的2个参数。如果它们是数组,则将它们视为列表,在第一个维度上进行迭代。
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
未被广泛使用。而且我怀疑在您的情况下,参差不齐的,不可广播的数组是没有用的。