[英]Python IF condition is not satisfy but it enter the script. Numpy any() and all() issue
我有这种条件来盯住if,而且我认为它是在未预期到的时候开始的,也许你们中的一个可以指出我的错误或建议一种更好的方法
这是脚本的一部分:
我获得了某些角度的值并将它们分配给T2,然后在某些时候我进行了比较
...
if 0 <= np.any(T2[i:]) < 0.5*np.pi:
Do something
该数组中的值不满足条件,但是无论如何它都会输入条件,我不知道为什么
在控制台中检查我得到:
In [10]: T2
Out[10]: array([ 1.84103563, 2.68108542, 2.73258615, 2.7358088 , 2.76608758,
2.8106091 ])
In [10]: 0 <= np.any(T2) < 0.5*np.pi
Out[10]: True
另一个评估输出:
In [15]: np.degrees(T2) < 10
Out[15]: array([False, False, False, False, False, False], dtype=bool)
In [16]: np.any(np.degrees(T2)) < 10
Out[16]: True
所以我想这是与使用.ANY /。所有的问题
在发布之前,我终于检查了:
In [27]: np.degrees(np.all(T2[i:]))
Out[27]: 57.281
分配给数组的值从哪里来? 您如何避免这种情况? 还有其他方法可以对数组进行条件处理吗?
这根本不是Python的工作方式:
if 0 <= np.any(T2[i:]) < 0.5*np.pi:
按照以下顺序进行评估:
if ( 0 <= np.any(T2[i:]) ) < 0.5*np.pi
first
~~ second ~~
~~~~~~ third ~~~~~~
~ fourth ~
~~~~~~~~~~~~~~~~~~~~~ fifth ~~~~~~
因此,首先[]
运算符会生成T2
的切片,即您可以迭代( first
)的内容。
然后, any
函数检查这些值中的any
是否都不为False(即不等于零)。 这将返回一个布尔值 ,即True
或False
。 ( second
)
由于True
为>0
且False == 0
,因此您的第一个比较始终为True
( third
)。 你也可以写
if True < 0.5*np.pi:
现在,与数值比较时, True
转换为1
。 因此,您的总体陈述与
if 1 < 0.5*np.pi:
总是这样。
因此,无论您期望什么,Python都将始终执行if
,因为您明确要求它这样做。 Python无法猜测您的意思
0 <= np.any(T2[i:]) < 0.5*np.pi
老实说,我也不会猜到你的意思。
正如其他答案中指出的那样, np.any
和np.all
会将数组简化为单个bool
(如果不使用axis
参数)。
它实际上告诉您数组中是否有任何(或所有)值与条件bool(value) == True
匹配。
您实际上想评估T2
中的任何值是否匹配0 <= T2 < 0.5 * np.pi
。 为了实现这一点,你应该评估np.any
上的组合0 <= T2
和T2 < 0.5 * np.pi
In [7]: T2 # Your array
Out[7]:
array([ 1.84103563, 2.68108542, 2.73258615, 2.7358088 , 2.76608758,
2.8106091 ])
In [8]: (0 <= T2) # First condition
Out[8]: array([ True, True, True, True, True, True], dtype=bool)
In [9]: (T2 < 0.5 * np.pi) # Second condition
Out[9]: array([False, False, False, False, False, False], dtype=bool)
In [10]: (0 <= T2) & (T2 < 0.5 * np.pi) # Combination of the conditions
Out[10]: array([False, False, False, False, False, False], dtype=bool)
In [11]: np.any((0 <= T2) & (T2 < 0.5 * np.pi)) # Use `any` of the combination
Out[11]: False
每个条件都产生一个T2
大小的bool
数组,检查条件是否为True
。 并且该组合使用逻辑AND来验证这两个条件是否均为True
。
最后, np.any
检查合并条件的任何值是否为True
。 您在寻找什么。
从文档中,np.any([-1,0,5])返回True。 因此,您基本上将True与0和0.5 * np.pi进行比较,这会使条件为true。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.