Python if语句有两个条件 - 数组的真值是模糊的

时间:2016-12-01 18:19:43

标签: python list numpy

----最后更新---- 变量' mtindex'的变量定义。有一个逗号而不是一个点导致python为真值条件返回两个值。

----更新了问题----
在for循环中运行if语句时出错。

我的for循环首先定义了两个变量' pctchange'和' pctchangeindex'作为基于从数据帧中提取的值的整数。因此,这些被定义为循环运行的每个x值的新值。然后,我将这两者之间的差异与此循环外定义的另一个变量(整数)进行比较。我通过在for循环中运行的if语句来执行此操作 - 以便对于我的两个循环变量的每个新值赋值,如果条件被测试:

for x in range(1,numdays-holdperiod1):
    pctchange = (int taken from dataframe)
    pctchangeindex = (int taken from dataframe)

    if ((pctchange - pctchangeindex) > mtindex and x-1 not in  
    positioncheck1) :
        calculate some things

运行此命令时,带有if语句的行会给出错误消息:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我还没能解决这个问题。我测试的是,当我删除if语句的第二部分时,我得到了同样的错误 - 所以它不应该是'和'那就是错误。我希望,因为if语句相对于for循环缩进,所以它为for循环中的变量的每个新赋值运行?我希望这次我的问题更清楚,我得到了一些回应,因为这个问题已经让我停了好几个月了。

----老问题---- 我在函数定义中有一个带有两个条件的if语句。引发错误的部分是:

 if (pctchange - pctchangeindex > mtindex and x-1 not in positioncheck1) :

我在Pycharm中得到了确切的错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我已经看到其他线程描述了相同的错误,并说它是由numpy解释数组引起的。 if条件的第二部分检查给定值是否在' positioncheck1' - 这是一个标准的python列表。

2 个答案:

答案 0 :(得分:1)

这可能有效:

if ((pctchange - pctchangeindex > mtindex).all() and x-1 not in positioncheck1)

有两个问题。

  • 运营商订单。将{()放在>左右,以便首先评估它。

  • 多个布尔值。作用于数组的>创建一个带有布尔值的数组。那些含糊不清的'在标量Python上下文中使用时(andif)。我添加了all(或any)以将这些值压缩为一个。

多个ValueError SO问题都处理了这个问题的一些变化 - 在标量Python上下文中使用了一个布尔数组。

以下是一些示例案例:

In [416]: np.arange(10)>6 | True
Out[416]: array([False, False, False, False, False, False, False, False,  True,  True], dtype=bool)
In [417]: (np.arange(10)>6) | True
Out[417]: array([ True,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

如果没有(),则会在|

之前评估>

使用and时,布尔数组必须先缩减为标量

In [418]: np.arange(10)>6 and True
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [419]: (np.arange(10)>6) and True
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [420]: (np.arange(10)>6).all() and True
Out[420]: False

答案 1 :(得分:0)

我终于找到了为什么返回了模糊真值的错误。 int类型的变量mtindex用逗号而不是点表示 - 这使得python将其解释为2个单独的值,从而给出两个真值语句。

感谢您的投入。