ValueError с объединением двух массивов с использованием оператора OR - PullRequest
0 голосов
/ 19 декабря 2018

Я использую Python и NumPy, где у меня есть пара NUMPY массивов одинаковой формы, и я пытаюсь создать объединение этих массивов.эти массивы содержат только 0 и 1, и в основном я хочу объединить их в новый массив с помощью операции OR.Итак, я делаю следующее:

import numpy as np

segs = list()
a = np.ones((10, 10)).astype('uint8')
b = np.zeros((10, 10)).astype('uint8')
segs.append(a)
segs.append(b)

mask = np.asarray([any(tup) for tup in zip(*segs)]).astype('uint8')

С последним уровнем я получаю сообщение об ошибке:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Если я использую np.any, то моя форма массива теперь просто (10,).Как я могу создать это слияние без явного зацикливания массивов?

EDIT

mask = np.asarray([any(tup) for tup in zip(segs)]).astype('uint8')

также приводит к той же ошибке.

1 Ответ

0 голосов
/ 19 декабря 2018

Ваш 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.

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