Ошибка значения: Значение истинности массива, содержащего более одного элемента, неоднозначно. Используйте.any() или. all() возникает при попытке найти максимальное значение

#python #numpy #boolean

Вопрос:

Я знаю, что этот вопрос задавали много раз, но ответы по-прежнему не имеют для меня смысла.

Как указано в названии, мне дана ошибка:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-33-ff6e3e2d3ced> in <module>
      3     env = PIEnv()
      4     act = [1,2]
----> 5     env.step(act)
      6 

<ipython-input-32-cdba1f862773> in step(self, action)
     74             self.PV[i] = T  # Input the the Temperature Value
     75 
---> 76             [op, P, ierr] = self._pid(action, self.SP[i], self.PV[i], ierr)
     77 
     78             self.OP[i] = op

<ipython-input-32-cdba1f862773> in _pid(self, action, sp, pv, ierr, dt)
     52         if np.any(op >= opho) or np.any(op <= oplo):
     53             I -= action[1] * self.error * dt
---> 54             op = max(oplo, min(opho, op))
     55 
     56         return [op, P, I]

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

Насколько я понимаю, мне нужно использовать a.any() или a.all() из numpy.ndarray -за того, что я пытаюсь выполнить логическое сравнение, как в строке 52, но я не понимаю, зачем мне нужно a.any() или a.all() для строки 54, op = max(oplo, min(opho, op)) . Я просто пытаюсь получить максимальное значение. Кто-нибудь может пролить немного света?

Спасибо!

Вот код. Это атрибут.

     def _pid(self, action, sp, pv, ierr, dt=1):
    
        op0 = 0.0  # Initial Heater setting also considered the bias
        oplo = 0  # Heater Lower Limit
        opho = 100  # Heater Higher Limit
        
        self.error = sp - pv  # Error
        integral_error = ierr   action[1] * self.error * dt #Integral Error
        
        P = action[0] * self.error  # Proportional
        I = integral_error  # Integral
        
        op = op0   P   I  # Calculates new output
        print(type(op>=opho))
        
        if np.any(op >= opho) or np.any(op <= oplo):
            I -= action[1] * self.error * dt
            op = max(oplo, min(opho, op))

        return [op, P, I]
 

Комментарии:

1. Функция max и min выполняет итерацию — например, список, кортеж, набор и т. Д.

2. Обратите внимание , что вы используете встроенные min , а max не векторизованные версии, предоставленные numpy . Встроенный min модуль пытается провести сравнение формы if (row i) < (row j) . Видите, в чем проблема? Если вы хотите вычислить минимум/максимум вдоль оси массива, np.min np.max вместо этого используйте/.

3. @It_is_Chris Это не обязательно. Смотрите встроенные документы . Оба min и max могут принимать переменное число аргументов.

4. Я думаю, что меня смущает то op , oplo opho что, я думаю, это не вектор, а int/float?. К сожалению, когда я пытаюсь op = np.max([oplo, np.min([opho, op])]) , я все равно получаю ту же ошибку. @Брайан