Значение истинности массива с более чем одним элементом является двусмысленным при попытке индексирования массива

Я пытаюсь поместить все элементы rbs в новый массив, если элементы в var (другой массив numpy)> = 0 и & lt; =. 1. Однако, когда я пробую следующий код, я получаю эту ошибку:

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

rbs = [ish[4] for ish in realbooks]
for book in realbooks:
    var -= float(str(book[0]).replace(":", ""))
    bidsred = rbs[(var <= .1) and (var >=0)]

есть идеи, что я делаю не так?

Ответ 1

Как я сказал вам в комментарии к предыдущему ответу, вам нужно использовать либо:

c[a & b]

или

c[np.logical_and(a, b)] 

Причина в том, что ключевое слово and используется Python для проверки между двумя булевыми. Как массив может быть логическим? Если 75% его элементов True, то это True или False? Поэтому numpy отказывается сравнивать два.

Таким образом, вам либо нужно использовать логическую функцию для сравнения двух булевых массивов на основе каждого элемента (np.logical_and), либо двоичного оператора &.

Кроме того, для индексирования вам действительно нужен логический массив с тем же размером, что и индексируемый массив. И он должен быть массивом, вместо этого вы не можете использовать список True/False:  Причина в том, что использование логического массива сообщает NumPy, какой элемент возвращается. Если вы используете список True/False, NumPy будет интерпретировать это как список 1/0 как целые числа, то есть индексы, что означает, что вы либо получаете второй, либо первый элемент вашего массива. Не то, что вы хотите.

Теперь, как вы можете предположить, если вы хотите использовать два булевых массива a или b для индексирования, выбирая элементы, для которых либо a, либо b - True, вы должны использовать

c[np.logical_or(a,b)]

или

c[a | b]

Ответ 2

Обычно вы получаете это сообщение об ошибке при попытке использовать булевы операторы Python (not, and, or) в выражениях сравнения с массивами Numpy, например

>>> x = np.arange(-5, 5)
>>> (x > -2) and (x < 2)
Traceback (most recent call last):
  File "<ipython-input-6-475a0a26e11c>", line 1, in <module>
    (x > -2) and (x < 2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Это потому, что такие сравнения, в отличие от других сравнений в Python, создают массивы логических, а не одиночных булевых (но, возможно, вы уже это знали):

>>> x > -2
array([False, False, False, False,  True,  True,  True,  True,  True,  True], dtype=bool)
>>> x < 2
array([ True,  True,  True,  True,  True,  True,  True, False, False, False], dtype=bool)

Часть решения вашей проблемы, возможно, заменит and на np.logical_and, которая передает операцию И по двум массивам np.bool.

>>> np.logical_and(x > -2, x < 2)
array([False, False, False, False,  True,  True,  True, False, False, False], dtype=bool)
>>> x[np.logical_and(x > -2, x < 2)]
array([-1,  0,  1])

Однако такие массивы логических значений не могут использоваться для индексации в обычные списки Python, поэтому вам нужно преобразовать их в массив:

rbs = np.array([ish[4] for ish in realbooks])

Ответ 3

# draw the previous original bounding boxes
if rectsPersist != None:
    for (x, y, w, h) in rectsPersist:
        cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)

# draw the previous final bounding boxes
if pickPersist != None:
    for (xA, yA, xB, yB) in pickPersist:
        cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)

if not count % 1:
    count = 0
    image = imutils.resize(image, width=min(700, image.shape[1]))

if rectsPersist! = None: ValueError: Значение истинности массива с более чем одним элементом является неоднозначным. Используйте a.any() или a.all()