Рубрики
Без рубрики

Как исправить “ValueError: Значение правды массива с более чем одним элементом неоднозначна. Использовать any () или A.all () “

Если вы запускаете следующий код, вы будете испытывать специальную ValueError: Import Numpy AS NP.Array ([1, 2, 3]) (A) Print (B) Вывод будет это сообщение об ошибке: valueError: Значение правды массива с более чем одним элементом неоднозначна. Используйте A.any () или A.all () Попробуйте сами в нашем интерактивном … Как исправить “ValueError: Значение правды массива с более чем одним элементом неоднозначна. Используйте Any () или A.all () «Подробнее»

Автор оригинала: Rafal Jasionowski.

Если вы запустите следующий код, вы будете испытывать специальное ValueError :

import numpy as np
a = np.array([1, 2, 3])
b = bool(a)
print(b)

Выход будет это сообщение об ошибке:

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

Попробуйте сами В нашем интерактивном оболочке браузера:

Решение : Использование Numpy Функции под названием logical_and () и logical_or () вместо Python’s Логические операторы («И» и «или») является решением.

Оставьте основы и присоединяйтесь к «встроенными функциями Python»: https://academy.finxter.com/university/python-built-in-functions-every-python-coder-must-know/

Почему ValueError вообще встречается?

Многие программисты, которые начинают изучать Numpy, думают, что они могут использовать логические операторы Python во время записи кода, но создатели этого модуля решили, что нет ни одного общедоступного способа оценки массива в булевом контексте.

Это может означать Правда Если любой Элемент – Правда или Правда Если Все Элементы – это Правда или Правда Если массив ненулевой длины. И мы только упомянули три возможности – все больше!

Поскольку разные пользователи могут иметь различные потребности и цели, разработчики отказались спекулировать и решили поднять ValueError. Каждый раз, когда кто-то пытается оценить массив в булевом контексте, так что они давали в обмен?

Функция logical_and () – эквивалент для “и”

logical_and () Функция эквивалентна встроенному «и» логическому оператору Python. Когда мы используем эту функцию, программа вернет массив с Правда и Ложь ценности.

Эта функция имеет два важных параметра, то есть наши входные массивы, которые мы поставили после запятой (в этом примере Arr1 <3 и Arr_2> 3 ). Давайте посмотрим на пример:

import numpy as np

arr_1 = np.arange(5)
arr_2 = np.arange(6, 10)
arr_3 = np.array(['First', 'Second', 'Third', 'Fourth', 'Fifth'])

mask = np.logical_and(arr_1 < 3, arr_2 > 3)
print(arr_3[mask])

Выход:

['First' 'Second' 'Third']

Код напечатал первый, второй и третий элемент массива arr_3. , Потому что он проверил наши условия, и выяснилось, что первые три числа наших массивов соответствуют условиям одновременно.

Функция logical_or () – эквивалент для “или”

Функциональность такая же, как предыдущая. Он также имеет два наиболее важных массива ввода параметров. Единственное различие в поведении кода, ведь мы хотим достичь чего-то другого:

import numpy as np

arr_1 = np.arange(5)
arr_2 = np.arange(5, 10)
arr_3 = np.array(['First', 'Second', 'Third', 'Fourth', 'Fifth'])

mask = np.logical_or(arr_1 >= 3, arr_2 < 3)
print(arr_3[mask])

Как минимум один из элементов на позициях 4 и 5 наших массивов соответствует нашему условию, результат заключается в следующем:

['Fourth' 'Fifth']

Логично и с “&” и логичным или с “|”

Вместо письма logical_and () или logical_or () Мы можем использовать & и |. символы. Посмотрите на этот код:

import numpy
arr_1 = np.arange(5)
arr_2 = np.arange(5, 10)
arr_3 = np.array(['First', 'Second', 'Third', 'Fourth', 'Fifth'])

# Same functionality as logical_and
mask = np.array((arr_1 < 3) & (arr_2 > 3))
print(arr_3[mask])

# Same functionality as logical_or
mask = np.array((arr_1 >= 3) | (arr_2 < 3))
print(arr_3[mask])

Выход:

['Fourth' 'Fifth']
['First' 'Second' 'Third']

любой() и все()

Поскольку эти две функции появляются в теме, вот быстрое объяснение того, что они делают вообще!

Функция любой () Проверяет, если какие-либо из элементов ненулено и все () проверяют, если все элементы ненульны. Эти функции принимают несколько параметров, но два являются наиболее важными:

  • А -> Входной массив или объект, который можно преобразовать в массив.
  • Ось -> Ось или оси, вдоль которых выполняется логическое или уменьшение. По умолчанию) – выполнить логические или по всему размерам входного массива. Ось может быть отрицательной, в этом случае он считается от последнего на первую ось.
arr_1 = np.array([[1, 2, 3, 0],[0, 1, 2, 3]])

print('Outputs of function any')
print(np.any(arr_1))
print(np.any(arr_1, axis=0))
print(np.any(arr_1, axis=1))

print('\nOutputs of function all')
print(np.all(arr_1))
print(np.all(arr_1, axis=0))
print(np.all(arr_1, axis=1))

Выход:

Outputs of function any:
True
[ True  True  True  True]
[ True  True]
 
Outputs of function all:
False
[False  True  True False]
[False False]

Как видите, наш скрипт проверил в начале, если какие-либо значения вдоль оси не нулевые.

Примечание : Ось = 0 вертикальная ось и ось = 1 это горизонтальная ось.

Резюме

Мы узнали, почему есть ошибка ValueError, когда мы хотим использовать логические операторы, встроенные в Python («и» и «или») в логических операциях при использовании массивов. Далее было 2 эквиваленты этих логических операторов («logical_and» и «logical_or») и еще более быстрый способ достижения того же. Наконец, функция любой () и все () в модуле Numpy была объяснена.

использованная литература

Оригинал: “https://blog.finxter.com/how-to-fix-valueerror-the-truth-value-of-an-array-with-more-than-one-element-is-ambiguous-use-a-any-or-a-all/”