#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])])
, я все равно получаю ту же ошибку. @Брайан