from numpy import *
m = array([[1,0],
[2,3]])
Я хотел бы вычислить элемент-мудрый log2(m)
, но только в тех местах, где m
не равен 0. В этих местах я хотел бы иметь 0. Как результат.
Сейчас я борюсь:
RuntimeWarning: divide by zero encountered in log2
Попробуйте 1: используя where
res = where(m != 0, log2(m), 0)
который вычисляет мне правильный результат, но я все еще регистрирую a RuntimeWarning: divide by zero encountered in log2
. Похоже, что (и синтаксически это совершенно очевидно) numpy все еще вычисляет log2(m)
на полной матрице, и только после этого where
выбирает значения, которые нужно сохранить.
Я бы хотел избежать этого предупреждения.
Попробуйте 2: использование масок
from numpy import ma
res = ma.filled(log2(ma.masked_equal(m, 0)), 0)
Конечно, маскировка нулей предотвратит log2
, чтобы применить к ним, не так ли? К сожалению, нет: мы все равно получаем RuntimeWarning: divide by zero encountered in log2
.
Несмотря на то, что матрица маскируется, log2
по-прежнему применяется к каждому элементу.
Как я могу эффективно вычислить элементный массив массива numpy без получения предупреждений о делении на нуль?
- Конечно, я мог временно отключить ведение журнала этих предупреждений с помощью
seterr
, но это не похоже на чистое решение. - И уверен, что цикл double for поможет справиться с 0s специально, но победит эффективность numpy.
Любые идеи?