Python ValueError: Значение истинности массива с более чем одним элементом является неоднозначным. Используйте a.any () или a.all () - PullRequest
0 голосов
/ 20 марта 2020

a = np.random.randint(1, 10, (3,3))
b = np.random.randint(1, 10, (3,3))
c = None

l1 = [a, b, c]

for l in l1:
  if l is None:
    l1.remove(l)
  l1

Я получаю ValueError: Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all (). Так как он уже проверяет, есть ли l, то почему он не может удалить его?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Причина этого заключается в том, что при попытке удалить l (что составляет None) из l1, remove(l) проходит через массив и проверяет, равен ли каждый элемент l. Как только он найдет этот элемент, он удалит его из списка. При выполнении сравнения он встречает a и проверяет, истинно ли a == None. Это создает массив логических значений с указанием того, имеет ли каждый элемент l значение None. Когда вы используете это в операторе if, становится неясным, истинно оно или нет.

Вместо этого используйте

l1 = [l for l in l1 if not type(l) == type(None)]

, чтобы отфильтровать все None в вашем списке.

1 голос
/ 20 марта 2020

В основном ваш код выполняет [a, b, c].remove(c), что делает что-то вроде:

for x in [a, b, c]:
    if x == c:
        # remove x

if x == c: разрывается в первом случае, когда x равен a: a == None возвращает новый массив.

Вот почему вы получаете это сообщение. Ответ Марселя имеет правильное решение. Вы не должны изменять (с помощью remove) список, поскольку вы все равно итерируете его.

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