Estou tentando realizar uma divisão inteligente de elemento em python, mas se um zero for encontrado, preciso que o quociente seja apenas zero.
Por exemplo:
array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])
array1 / array2 # should be np.array([0, 1, 2])
Eu sempre poderia usar um loop for em meus dados, mas para realmente utilizar as otimizações de numpy, preciso que a função divide retorne 0 sobre erros de divisão por zero em vez de ignorar o erro.
A menos que esteja faltando alguma coisa, não parece que numpy.seterr () pode retornar valores em caso de erros. Alguém tem alguma outra sugestão sobre como eu poderia tirar o melhor proveito do numpy enquanto definia minha própria divisão por zero de tratamento de erros?
python
arrays
numpy
error-handling
divide-by-zero
hlin117
fonte
fonte
Respostas:
No numpy v1.7 +, você pode tirar proveito da opção "onde" para ufuncs . Você pode fazer as coisas em uma linha e não precisa lidar com o gerenciador de contexto errstate.
Nesse caso, ele faz o cálculo de divisão em qualquer lugar 'onde' b não é igual a zero. Quando b for igual a zero, ele permanecerá inalterado de qualquer valor que você forneceu originalmente no argumento 'out'.
fonte
a
e / oub
puderem ser matrizes inteiras, então é o mesmo conceito, você só precisa definir explicitamente o tipo de saída correto:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
out=np.zeros_like(a)
é crítica, conforme indicado na linha comentada.np.divide(a, b, out=np.zeros_like(a), where=b!=0)
, recebo o erroAssigning to function call which doesn't return
. O estranho é que eu uso duas vezes e o erro só aparece uma vez.Com base na resposta de @Franck Dernoncourt, corrigindo -1 / 0:
fonte
~
inverteTrue
eFalse
em matrizes numpy:print ~ np.array([ True, False, False ])
.c[ ~ np.isfinite( c )] = 0
significa: encontre as posições ondec
é finito, inverta-os para NÃO finito com~
e defina os valores não finitos para 0. Veja também stackoverflow.com/search?q=[numpy]+"boolean+indexing "Com base nas outras respostas e melhorando:
0/0
manipulação adicionandoinvalid='ignore'
anumpy.errstate()
numpy.nan_to_num()
a converternp.nan
a0
.Código:
Resultado:
fonte
0/0
e também para1/0
erros.a
oub
contiverNaN
, sua solução repentinamente dará0
um resultado. Isso pode facilmente ocultar erros em seu código e é absolutamente inesperado.numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
é a assinatura.One-liner (lança um aviso)
fonte
Tente fazer isso em duas etapas. Divida primeiro, depois substitua.
A
numpy.errstate
linha é opcional e apenas evita que numpy informe sobre o "erro" de dividir por zero, uma vez que você já pretende fazer isso e cuidar desse caso.fonte
np.errstate(divide='ignore'):
divide='warn'
também pode ser útil se ele / ela ainda quiser ser notificado.Você também pode substituir com base em
inf
, apenas se os tipos da matriz forem flutuantes, de acordo com esta resposta :fonte
Uma resposta que encontrei ao pesquisar uma questão relacionada foi manipular a saída com base no denominador zero ou não.
Suponha
arrayA
earrayB
foram inicializados, masarrayB
tem alguns zeros. Poderíamos fazer o seguinte se quisermos computararrayC = arrayA / arrayB
com segurança.Neste caso, sempre que tenho uma divisão por zero em uma das células, eu defino a célula para ser igual a
myOwnValue
, que neste caso seria zeroNota de rodapé: Em retrospecto, esta linha é desnecessária de qualquer maneira, pois
arrayC[i]
é instanciada em zero. Mas se fosse esse o casomyOwnValue != 0
, essa operação faria alguma coisa.fonte
Outra solução que vale a pena mencionar:
fonte