numpy.select的行为异常

时间:2019-02-28 11:30:06

标签: python-2.7 numpy

我在使用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循环)。

(我想将这类代码与contourshierarchycv.findContours输出一起使用),我已经隔离了上面的困难。不幸的是,每个轮廓的长度都不相同...)

1 个答案:

答案 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

简而言之,condlistchoicelist的长度必须相等,并且这些列表的所有元素必须是可以相互广播的数组。输出将是具有常见广播形状的数组。

np.select未被广泛使用。而且我怀疑在您的情况下,参差不齐的,不可广播的数组是没有用的。