Условный цикл с массивами numpy

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

Я пытаюсь реализовать следующее простое условие с массивами numpy, но результат неверен.

 dt = 1.0
t = np.arange(0.0, 5.0, dt)
x = np.empty_like(t)
if np.where((t >=0) amp; (t < 3)):
    x = 2*t
else:
    x=4*t
  

Я получаю вывод ниже

 array([0., 2., 4., 6., 8.])
  

Но я ожидаю

 array([0., 2., 4., 12., 16.])
  

Спасибо за вашу помощь!

Ответ №1:

Поиск в документации для np.where :

Примечание: Когда указано только условие, эта функция является сокращением для np.asarray(condition).nonzero() . Предпочтительнее использовать nonzero напрямую, поскольку он ведет себя правильно для подклассов. Остальная часть этой документации охватывает только случай, когда предоставляются все три аргумента.

Поскольку вы не предоставляете аргументы x and y , where действует nonzero следующим образом . nonzero возвращает tuple значение np.arrays , которое является истинным при преобразовании в bool. Таким образом, ваш код в конечном итоге оценивается как:

 if True:
    x = 2*t
  

Вместо этого вы хотите использовать:

 x = np.where((t >= 0) amp; (t < 3), 2*t, 4*t)
  

Ответ №2:

Использование np.where отличается

 dt = 1.0
t = np.arange(0.0, 5.0, dt)
x = np.empty_like(t)
x = np.where((t >= 0) amp; (t < 3), 2*t, 4*t)
x
  

Вывод

 [ 0.,  2.,  4., 12., 16.]
  

Ответ №3:

в вашем коде оператор if не является необходимым и вызывает проблему.

np.where() создает условие, поэтому вам не нужен оператор if.

Вот рабочий пример вашего кода с выводом, который вы хотите

 dt = 1.0
t = np.arange(0.0, 5.0, dt)
x = np.empty_like(t)
np.where((t >=0) amp; (t < 3),2*t,4*t)

  

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

1. Каков наилучший способ написания этого кода, если у меня есть несколько условий if-then, поскольку np.where допускает только 3 аргумента? dt = 1.0 t = np.arange(0.0, 4.0, dt) x = np.empty_like(t) if ((t>=0.0).any()) amp; ((t<1.0).any()): x = 2*t elif ((t>=1.0).any()) amp; ((t<2.0).any()): x = 3*t elif ((t>=2.0).any()) amp; ((t<3.0).any()): x = 4*t else: x = 5*t

2. Привет, вам просто нужно связать условие, как в Excel. dt = 1.0 t = np.arange(0.0, 5.0, dt) x = np.empty_like(t) x = np.where((t >=0) amp; (t < 1),2*t,np.where((t >=1) amp; (t < 2),3*t,np.where((t >=2) amp; (t < 3),4*t,5*t)))