繁体   English   中英

Python IF条件不满足,但它输入了脚本。 Numpy any()和all()问题

[英]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(即不等于零)。 这将返回一个布尔值 ,即TrueFalse second

由于True>0False == 0 ,因此您的第一个比较始终为Truethird )。 你也可以写

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.anynp.all会将数组简化为单个bool (如果不使用axis参数)。

它实际上告诉您数组中是否有任何(或所有)值与条件bool(value) == True匹配。

您实际上想评估T2中的任何值是否匹配0 <= T2 < 0.5 * np.pi 为了实现这一点,你应该评估np.any上的组合0 <= T2T2 < 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM