2016-07-08 2 views
0

Я использую numpy.where, и мне было интересно, есть ли простой способ избежать вызова неиспользуемого параметра. Пример:numpy.where: как отложить оценку параметров?

import numpy as np 
z = np.array([-2, -1, 0, 1, -2]) 
np.where(z!=0, 1/z, 1) 

возвращается:

array([-0.5, -1. , 1. , 1. , -0.5]) 

, но я получаю деление на ноль предупреждения, потому что, когда z был 0, код по-прежнему оценивает 1/z, даже если он не использует его.

+0

Почему бы вам не использовать z = z [np.nonzero (z)], тогда разделите на z, но это просто возвращает 1, поэтому я не уверен, почему –

+0

'1/z' выполняется интерпретатором как часть вызова 'where'. Это не под контролем 'where'. Но вы можете сделать 'out [ind] = 1/z [ind]' где 'ind' - маска значений ok. Существуют и другие способы деления на ноль. – hpaulj

+0

Поиск тегов [numpy] и [divide-by-zero] – hpaulj

ответ

1

Вы можете применить маску:

out = numpy.ones_like(z) 
mask = z != 0 
out[mask] = 1/z[mask] 
1

Вы также можете отключить предупреждение и включите его снова после того, как вы сделали с помощью контекстного менеджера errstate:

with np.errstate(divide='ignore'): 
    np.where(z!=0, 1/z, 1) 
0

SciPy имеет небольшая полезность только для этой цели: https://github.com/scipy/scipy/blob/master/scipy/_lib/_util.py#L26

Это в основном вопрос распределения выходного сигнала arr ay и используя np.place (или пустую маску), чтобы заполнить именно то, что вам нужно.

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

  • Нет связанных вопросов^_^