2016-12-01 7 views
-2

---- последнее обновление ---- В определении переменной переменной «mtindex» вместо запятой была указана запятая, которая заставляла python возвращать два значения для правда состояние.Оператор Python if с двумя условиями - значение истинности массива неоднозначное

---- Обновленный вопрос ----
Я получаю сообщение об ошибке при запуске оператора if внутри цикла for.

Первый цикл for for определяет два переменных «pctchange» и «pctchangeindex» как целые числа, основанные на значении, извлеченном из фрейма данных. Таким образом, они определяются как новое значение для каждого значения x, через которое проходит цикл. Затем я сравниваю разницу между этими двумя с другой переменной (integer), определенной за пределами этого цикла. Я делаю это через, если заявление, которое проходит внутри для цикла - так, что для каждого нового назначения значений для моих двух переменных цикла это, если условие проверяется:

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 

Когда это запустить линию, если заявление дает мне сообщение об ошибке:

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() 

Я видел другие темы decribing ту же ошибку, и говоря, что это вызвано Numpy интерпретации массивов по-разному , Вторая часть условия if проверяет, находится ли данное значение в 'positioncheck1', которое является стандартным списком python.

+3

Также укажите содержание, которое хранят ваши переменные –

+2

, сообщите нам, что у всех переменных есть/есть? –

+0

В чем вопрос? И сообщение об ошибке сообщает вам, в чем проблема и что делать. –

ответ

1

Это может работать:

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

Есть 2 проблемы.

  • Операторский заказ. Положите() вокруг >, поэтому сначала оценивается.

  • несколько булевых значений. >, действующий на массивы, создает массив с булевыми значениями. Они «неоднозначны» при использовании в скалярном контексте Python (and и if). Я добавил 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 
+0

Я не вижу первую проблему. Что было бы неправильно оценено до '>'? –

+0

С 'и' это, вероятно, не проблема; с такими операторами, как '|' и '&'. В любом случае нет никакого вреда в использовании дополнительных '()', даже если все, что они делают, улучшает читаемость. – hpaulj

+0

Это 'и', хотя, и это имеет более низкий приоритет. Поэтому я считаю, что проблема вводит в заблуждение. –

0

Я наконец выяснил, почему была возвращена ошибка двусмысленного значения истины. Переменная mtindex типа int была указана с запятой вместо точки, что сделало питон интерпретиро вать его как 2 отдельных значения, таким образом, давая два утверждения истинности.

Спасибо за ваши данные.

+0

Пожалуйста, используйте ссылку для редактирования по вашему вопросу, чтобы добавить дополнительную информацию. Кнопка «Ответ на сообщение» должна использоваться только для полных ответов на вопрос. - [Из обзора] (/ review/low-quality-posts/15657508) – SUB0DH

+0

Насколько я вижу, это ответ на мою конкретную ситуацию, поскольку ошибка, которую я сделал в определении переменной, вызвала ошибку. Но я вижу, что вы могли бы рассмотреть этот вопрос, который был отменен, чем на самом деле. Я обновил вопрос. – Simon

Смежные вопросы