Ваш segs
представляет собой список из 2 массивов:
In [25]: segs = [np.ones((3,6),'uint8'), np.zeros((3,6),'uint8')]
In [26]: [tup for tup in zip(*segs)]
Out[26]:
[(array([1, 1, 1, 1, 1, 1], dtype=uint8),
array([0, 0, 0, 0, 0, 0], dtype=uint8)),
(array([1, 1, 1, 1, 1, 1], dtype=uint8),
array([0, 0, 0, 0, 0, 0], dtype=uint8)),
(array([1, 1, 1, 1, 1, 1], dtype=uint8),
array([0, 0, 0, 0, 0, 0], dtype=uint8))]
zip
создает наборы 1d массивов (пары строк двух массивов).Python any
, примененный к массивам, дает ошибку неоднозначности - это верно для других логических операций Python, таких как if
, or
и т. Д., Которые ожидают скаляр True/False
.
Вы пробовали np.any
-это превращает кортеж массивов в двумерный массив.Но без параметра axis
он работает на плоской версии, возвращает скаляр True/False
.Но с параметром оси мы можем применить это any
к строкам:
In [27]: [np.any(tup, axis=0) for tup in zip(*segs)]
Out[27]:
[array([ True, True, True, True, True, True]),
array([ True, True, True, True, True, True]),
array([ True, True, True, True, True, True])]
Используя ufunc logical_or
, как предложено в комментарии:
In [31]: np.logical_or(segs[0],segs[1])
Out[31]:
array([[ True, True, True, True, True, True],
[ True, True, True, True, True, True],
[ True, True, True, True, True, True]])
In [32]: np.logical_or.reduce(segs)
Out[32]:
array([[ True, True, True, True, True, True],
[ True, True, True, True, True, True],
[ True, True, True, True, True, True]])
Используя '|'оператор не совсем то же самое:
In [33]: segs[0] | segs[1]
Out[33]:
array([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]], dtype=uint8)
Он использует метод segs[0].__or__(segs[1])
.Я должен проверить документы, чтобы увидеть, что происходит.Приложение к uint8
(или другим числовым значениям) отличается от приложения к bool
.Почти выглядит как max
.