Я пытаюсь выполнить поэлементное деление в python, но если встречается ноль, мне нужно, чтобы частное было просто нулем.
Например:
array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])
array1 / array2 # should be np.array([0, 1, 2])
Я всегда мог бы просто использовать цикл for для моих данных, но чтобы действительно использовать оптимизацию numpy, мне нужно, чтобы функция деления возвращала 0 при делении на ноль ошибок вместо игнорирования ошибки.
Если я чего-то не упускаю, похоже, что numpy.seterr () может возвращать значения при ошибках. Есть ли у кого-нибудь другие предложения о том, как я могу получить максимальную отдачу от numpy, устанавливая собственный разделитель на нулевую обработку ошибок?
Ответы:
В numpy v1.7 + вы можете воспользоваться опцией «где» для ufuncs . Вы можете делать что-то в одной строке, и вам не нужно иметь дело с диспетчером контекста errstate.
В этом случае вычисление деления выполняется везде, где b не равно нулю. Когда b действительно равно нулю, оно остается неизменным по сравнению с тем значением, которое вы изначально указали в аргументе out.
источник
a
и / илиb
могут быть целочисленными массивами, то это та же концепция, вам просто нужно явно указать правильный тип вывода:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
out=np.zeros_like(a)
критично, как указано в прокомментированной строке.np.divide(a, b, out=np.zeros_like(a), where=b!=0)
, я получаю сообщение об ошибкеAssigning to function call which doesn't return
. Странно то, что я использую его дважды, а ошибка появляется только один раз.Основываясь на ответе @Franck Dernoncourt, исправляя -1/0:
источник
~
переворачиваетTrue
иFalse
в Numpy массивов:print ~ np.array([ True, False, False ])
.c[ ~ np.isfinite( c )] = 0
означает: найти позиции, гдеc
является конечным, преобразовать их в НЕ конечные с помощью~
и установить не-конечные значения на 0. См. также stackoverflow.com/search?q=[numpy ]+ "Основываясь на других ответах и улучшая:
0/0
обработка путем добавленияinvalid='ignore'
кnumpy.errstate()
numpy.nan_to_num()
с преобразованиемnp.nan
в0
.Код:
Вывод:
источник
0/0
а также1/0
ошибок.a
илиb
содержитNaN
, ваше решение внезапно дает0
результат. Это может легко скрыть ошибки в вашем коде и является совершенно неожиданным.numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
это подпись.Однострочный (выдает предупреждение)
источник
Попробуйте сделать это в два этапа. Сначала деление, затем замена.
numpy.errstate
Линия не является обязательным, и только мешает Numpy возвещать вам о «ошибки» деления на ноль, так как вы уже намерены сделать это, и регулировать это дело.источник
np.errstate(divide='ignore'):
divide='warn'
также может быть полезно, если он / она хочет получать уведомления.Вы также можете заменить на основе
inf
, только если dtypes массива являются плавающими, согласно этому ответу :источник
Один ответ, который я нашел при поиске связанного вопроса, заключался в том, чтобы манипулировать выводом в зависимости от того, был ли знаменатель нулевым или нет.
Предположим
arrayA
иarrayB
были инициализированы, ноarrayB
имеют несколько нулей. Мы могли бы сделать следующее, если хотим вычислитьarrayC = arrayA / arrayB
безопасно .В этом случае, всякий раз, когда у меня делится на ноль в одной из ячеек, я устанавливаю ячейку равной
myOwnValue
, что в данном случае будет равно нулю.Сноска. Оглядываясь назад, можно сказать, что эта строка в любом случае не нужна, поскольку
arrayC[i]
ее экземпляр равен нулю. Но если бы это было такmyOwnValue != 0
, эта операция что-то сделала бы.источник
Еще одно решение, о котором стоит упомянуть:
источник