假设我有一个例子
a = np.arange(6)
以下操作之间发生了什么,输出是如何产生的?
np.where(a > 4) and np.where(a > 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"
。
这非常适合逻辑比较,但是当表达式不是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
,如果第一个表达式为 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