Как обрабатывать исключения в матричных делениях Numpy в Python? [Дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

46
задан hlin117 20 August 2015 в 05:04
поделиться

7 ответов

В numpy v1.7 + вы можете воспользоваться опцией «where» для ufuncs . Вы можете делать что-то в одной строке, и вам не нужно иметь дело с менеджером контекста errstate.

>>> a = np.array([-1, 0, 1, 2, 3], dtype=float)
>>> b = np.array([ 0, 0, 0, 2, 2], dtype=float)

>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)
>>> print(c)
[ 0.   0.   0.   1.   1.5]

В этом случае он вычисляет деление где угодно, где «b» не равен нулю. Когда значение b равно нулю, оно остается неизменным от любого значения, которое вы изначально дали ему в аргументе 'out'.

65
ответ дан DStauffman 16 August 2018 в 11:51
поделиться
  • 1
    Это должен быть принятый ответ. – mrplants 2 December 2017 в 22:50
  • 2
    FWIW Мне также нравится ответ Дениса. Было бы неплохо объединить все ответы в один. – hlin117 3 December 2017 в 21:11

Вы также можете заменить на основе inf, только если массивы dtypes являются float, в соответствии с этот ответ :

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> c = a / b
>>> c
array([ inf,   2.,   1.])
>>> c[c == np.inf] = 0
>>> c
array([ 0.,  2.,  1.])
2
ответ дан Community 16 August 2018 в 11:51
поделиться

Основываясь на ответе @Franck Dernoncourt, фиксируя -1 / 0:

def div0( a, b ):
    """ ignore / 0, div0( [-1, 0, 1], 0 ) -> [0, 0, 0] """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
        c[ ~ np.isfinite( c )] = 0  # -inf inf NaN
    return c

div0( [-1, 0, 1], 0 )
array([0, 0, 0])
36
ответ дан denis 16 August 2018 в 11:51
поделиться
  • 1
    Спасибо, я даже не поймал эту ошибку с кодом @Frank Dernoncourt. – hlin117 29 February 2016 в 18:38
  • 2
    Привет, я пытаюсь сделать массив математики, и я хочу 0/0, чтобы привести к 0, но я также хочу игнорировать np.NaN в моих расчетах. Будет ли это работать для этого? Кроме того, я пытаюсь понять. Что делает c [~ np.isfinite (c)] = 0? Я никогда не использовал ~ в python. Для чего это? спасибо – user20408 17 May 2016 в 14:41
  • 3
    @ user20408, ~ инвертирует True и False в массивах numpy: print ~ np.array([ True, False, False ]). c[ ~ np.isfinite( c )] = 0 означает: найти позиции, где c конечен, инвертировать те, которые НЕ конечны с ~, и установить не конечные значения в 0. См. также stackoverflow.com/search?q= [numpy ] + & Quot; булево + индексирование & Quot ; – denis 20 May 2016 в 09:07

Основываясь на других ответах и ​​улучшая обработку:

Код:

import numpy as np

a = np.array([0,0,1,1,2], dtype='float')
b = np.array([0,1,0,1,3], dtype='float')

with np.errstate(divide='ignore', invalid='ignore'):
    c = np.true_divide(a,b)
    c[c == np.inf] = 0
    c = np.nan_to_num(c)

print('c: {0}'.format(c))

Выход:

c: [ 0.          0.          0.          1.          0.66666667]
34
ответ дан Franck Dernoncourt 16 August 2018 в 11:51
поделиться
  • 1
    Хорошая работа для проверки ошибок 0/0, а также ошибок 1/0. – hlin117 20 August 2015 в 04:31

Один ответ, который я нашел, чтобы найти связанный с ним вопрос, заключался в том, чтобы манипулировать выходом на основе того, был ли знаменатель нулевым или нет.

Предположим, что arrayA и arrayB были инициализированы, но arrayB имеет некоторые нули. Мы могли бы сделать следующее, если мы хотим безопасно вычислить arrayC = arrayA / arrayB.

В этом случае, когда у меня есть деление на ноль в одной из ячеек, я устанавливаю ячейку равным myOwnValue , который в этом случае был бы равен нулю

myOwnValue = 0
arrayC = np.zeros(arrayA.shape())
indNonZeros = np.where(arrayB != 0)
indZeros = np.where(arrayB = 0)

# division in two steps: first with nonzero cells, and then zero cells
arrayC[indNonZeros] = arrayA[indNonZeros] / arrayB[indNonZeros]
arrayC[indZeros] = myOwnValue # Look at footnote

. Сноска: ретроспективно эта строка не нужна в любом случае, так как arrayC[i] создается на ноль. Но если бы это было так myOwnValue != 0, эта операция могла бы что-то сделать.

0
ответ дан hlin117 16 August 2018 в 11:51
поделиться

Попробуйте сделать это в два этапа. Раздел сначала, затем замените.

with numpy.errstate(divide='ignore'):
    result = numerator / denominator
    result[denominator == 0] = 0

Строка numpy.errstate является необязательной и просто запрещает numpy сообщать вам о «ошибке» деления на ноль, поскольку вы уже намереваетесь сделать это , и обрабатывая этот случай.

10
ответ дан Pi Marillion 16 August 2018 в 11:51
поделиться
  • 1
    Вероятно, вы должны выполнить деление в контексте np.errstate(divide='ignore'): – Warren Weckesser 8 October 2014 в 05:18
  • 2
    @WarrenWeckesser Справедливая точка. Я отредактировал ответ, чтобы включить контекст. divide='warn' также может быть полезна, если он / она хочет, чтобы все еще были уведомлены. – Pi Marillion 9 October 2014 в 01:38
  • 3
    не работает, если denominator является скалярным – denis 29 February 2016 в 10:36

Однострочный (предупреждение броска)

np.nan_to_num(array1 / array2)
13
ответ дан Ulf Aslak 16 August 2018 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: