Я не уверен, как Matlab обрабатывает деление на ноль, но возможно изменить поведение numpy, используя np.errstate
.
a = np.arange(-5, 5.)
b = np.arange(-2, 8.)
with np.errstate(divide='ignore'):
res0 = a / b
res1 = b / a
print(res0, '\n', res1)
# [ 2.5 4. -inf -2. -0.5 0. 0.25 0.4 0.5 0.57142857]
# [ 0.4 0.25 -0. -0.5 -2. inf 4. 2.5 2. 1.75]
В качестве альтернативы создайте функцию, которая может установить inf, -inf приводит к полезному значению по умолчанию.
def do_div( a,b, def_val=np.inf):
with np.errstate(divide='ignore'):
res = a / b
res[ ~np.isfinite(res) ] = def_val
return res
print( do_div( a, b, 100 ))
# [ 2.5 4. 100. -2. -0.5 0. 0.25 0.4 0.5 0.57142857]
print( do_div( b, a, 100 ))
# [ 0.4 0.25 -0. -0.5 -2. 100. 4. 2.5 2. 1.75]
Установка состояния деления для деления на «игнорировать» подавляет предупреждение. Numpy возвращает плюс или минус бесконечность для деления на ноль. Функция do_div устанавливает любые значения бесконечности по умолчанию. В моей работе это чаще всего ноль. Я использовал 100 здесь, так что это легко увидеть. Matlab, вероятно, делает нечто подобное, возвращая бесконечность или альтернативное значение по умолчанию и не выдавая ошибку или предупреждение.