Что происходит при выполнении логического И между двумя массивами? - PullRequest
0 голосов
/ 15 декабря 2018

Предположим, у меня был пример

a = np.arange(6)

Что происходит между следующей операцией и как получается выход?

np.where(a > 4) and np.where(a > 2)

Ответы [ 2 ]

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

Я подозреваю, что вы запутались, что

np.where(a > 4) and np.where(a > 2)

возвращает результат 2-го выражения

(array([3, 4, 5], dtype=int64),)

Это ожидаемое поведение при использовании and.

Оценка работает следующим образом:

True and "hello"

сначала True оценивается.Поскольку это не ложь , возвращается "hello".

Это отлично работает для логического сравнения, но имеет неинтуитивное поведение, когда выражения не True или False

True and True # returns True (the 2nd `True`)
False and (lambda: "hello") # the first `False` evaluates to `False` and is returned, the lambda function is not evaluated

Аналогично, для or, если первое выражение равно truey , второе не оценивается, но если первое значение равно falsy , то2-е возвращается.

True or (print("False")) # first expression is True, the 2nd is not evaluated
False or (print("False")) # first expression is False, 2nd expression is evaluated, but nothing is returned as the 2nd expression returns nothing
(lambda:"hello") or False # returns the lambda function
False or (lambda:"hello") # also returns "hello"
False or True # first expression is false, therefore 2nd expression is returned.

Следующие вещи оцениваются как ложь :

  • None
  • False
  • 0
  • пустой список, т. Е. [] или list()
  • пустой дикт, т.е. {} или dict()
  • пустой набор,то есть set()

Несколько нелогично, np.nan будет оцениваться как правдивый

пример:

np.nan or 100 # returns np.nan
np.nan and 100 # returns 100

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

# imagine that x is a list
# it it is not empty, return it
# do something more to x before returning it
if x:
  return x
x = ["goodbye", "cruel", "world", "its", "over", "walk", "on", "by"]
return x
0 голосов
/ 15 декабря 2018

Это не вопрос Numpy, а вопрос Python.

Python and вернет один из операндов - левый, если он ложный, в противном случае правый.Например:

0 and 42 возвращает 0, потому что в этом контексте значение false.Когда оба имеют значение True, он возвращает второе:

45 and 42 возвращает 42.

np.where() возвращает кортеж, который будет оцениваться как True.В результате:

np.where(a > 2) and np.where(a > 4)

Всегда будет возвращать результат второго np.where()

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