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