numpy.select有一种奇怪的行为

问题描述 投票:0回答:1

我对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输出)使用这种代码,我已经把上面的难度分开了。不幸的是,每个轮廓的长度不一样......)

python-2.7 numpy
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.