Numpy: нужна помощь в понимании того, что происходит с оператором "in" - PullRequest
6 голосов
/ 03 ноября 2011

Буду признателен, если кто-нибудь поможет мне с этим (и объяснит, что происходит).

Это работает:

>>> from numpy import array
>>> a = array((2, 1))
>>> b = array((3, 3))
>>> l = [a, b]
>>> a in l
True

Но это не так:

>>> c = array((2, 1))
>>> c in l
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Поведение, которое я хотел бы воспроизвести:

>>> x = (2, 1)
>>> y = (3, 3)
>>> l2 = [x, y]
>>> z = (2, 1)
>>> z in l2
True

Обратите внимание, что выше также работает с изменяемыми объектами:

>>> x = [2, 1]
>>> y = [3, 3]
>>> l2 = [x, y]
>>> z = [2, 1]
>>> z in l2
True

Конечно, зная, что:

>>> (a < b).all()
True

Я пытался (и не смог):

>>> (c in l).all()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

1 Ответ

6 голосов
/ 03 ноября 2011

Python делает выбор, что bool([False,True]) равно True, потому что (он говорит), что любой список не-empy имеет логическое значение True.

Numpy делает выбор, что bool(np.array([False, True])) должен вызвать ValueError. Numpy был разработан с точки зрения того, что некоторые пользователи могут захотеть узнать, являются ли любые элементов в массиве True, тогда как другие могут захотеть узнать, если все элементы в Массив True. Поскольку у пользователей могут быть противоречивые желания, NumPy отказывается угадывать. Он вызывает ValueError и предлагает использовать np.any или np.all (хотя, если кто-то хочет повторить поведение, подобное Python, вы должны использовать len).

Когда вы оцениваете c in l, Python сравнивает c с каждым элементом в l, начиная с a. Он оценивает bool(c==a). Мы получаем bool(np.array([True True])), который вызывает ошибку ValueError (по причине, описанной выше).

Так как numpy отказывается угадывать, вы должны быть конкретны. Я предлагаю:

import numpy as np
a=np.array((2,1))
b=np.array((3,3))
c=np.array((2,1))
l=[a,b]
print(any(np.all(c==elt) for elt in l))
# True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...