numpy.select имеет странное поведение - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть некоторые проблемы с np.select:

s=np.array([False,True],dtype=bool)
v=np.array([np.array([1,2]),np.array([3])])
np.select(s,v)

return

array([3, 3])

, что мне не понятно.Более того, если я заменю v на

v=np.array([np.array([1,2]),np.array([3,4,5])])

, я получаю сообщение об ошибке.Это, очевидно, связано с типом переменной v, поскольку он хорошо работает, когда v представляет собой массив целых чисел или массив массивов с аналогичной длиной (матрица).Так почему же это не работает в моем случае?Я ищу хороший метод для его решения (без цикла for).

(я хочу использовать этот вид кода с contours и hierarchy (cv.findContours выходами), и я изолировалсложность выше. К сожалению, каждый контур не имеет одинаковую длину ...)

1 Ответ

0 голосов
/ 28 февраля 2019

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 широко не используется.И я подозреваю, что в вашем случае с рваными, не транслируемыми массивами это бесполезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...