在两个numpy数组之间执行逻辑与时会发生什么?

时间:2018-12-15 05:16:49

标签: python numpy

假设我有一个例子

a = np.arange(6)

以下操作之间发生了什么,输出是如何产生的?

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

2 个答案:

答案 0 :(得分:2)

这不是一个Numpy问题,而是一个Python问题。

Python的and将返回操作数之一-如果为false,则返回左侧,否则返回右侧。例如:

0 and 42返回0,因为在这种情况下它为false。当两者都为True时,将返回第二个:

45 and 42返回42。

np.where()返回一个元组,其结果将为True。结果是:

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

将始终返回第二个np.where()

的结果

答案 1 :(得分:0)

我怀疑你对此感到困惑

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

返回第二个表达式的结果

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

这是使用and时的预期行为。

评估工作如下:

True and "hello"

首先评估True。由于不是 fassy ,因此返回下一个"hello"

这非常适合逻辑比较,但是当表达式不是TrueFalse时具有一些非直觉的行为

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,如果第一个表达式为 truthy ,则不评估第二个表达式,但是如果第一个表达式为 falsy ,则返回第二个表达式

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