[python] 0으로 나누고 0을 반환하는 방법

파이썬에서 요소 현명한 나누기를 수행하려고하지만 0이 발생하면 몫이 0이되어야합니다.

예를 들면 :

array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])

array1 / array2 # should be np.array([0, 1, 2])

항상 내 데이터를 통해 for 루프를 사용할 수 있지만 실제로 numpy의 최적화를 활용하려면 오류를 무시하는 대신 0으로 나누기 오류를 0으로 반환하는 나누기 함수가 필요합니다.

내가 뭔가를 놓치고 있지 않는 한 numpy.seterr () 이 오류에 대해 값을 반환 할 수있는 것 같지 않습니다 . 누구든지 0으로 나누기 오류 처리를 설정하는 동안 numpy에서 최선을 다할 수있는 방법에 대한 다른 제안이 있습니까?



답변

numpy v1.7 이상에서는 ufuncs 에 대한 “where”옵션을 활용할 수 있습니다. 한 줄로 작업을 수행 할 수 있으며 errstate 컨텍스트 관리자를 다룰 필요가 없습니다.

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

# If you don't pass `out` the indices where (b == 0) will be uninitialized!
>>> c = np.divide(a, b, out=np.zeros_like(a), where=b!=0)
>>> print(c)
[ 0.   0.   0.   1.   1.5]

이 경우 ‘where’b가 0이 아닌 곳에서 나누기 계산을 수행합니다. b가 0과 같으면 원래 ‘out’인수에서 제공 한 값에서 변경되지 않습니다.


답변

@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])


답변

다른 답변을 바탕으로 다음을 개선합니다.

암호:

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]


답변

한 줄짜리 (경고 발생)

np.nan_to_num(array1 / array2)


답변

두 단계로 시도하십시오. 먼저 분할 한 다음 교체하십시오.

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

numpy.errstate줄은 선택 사항이며 numpy가 0으로 나누는 “오류”에 대해 알려주지 않습니다. 이미 그렇게하려고했기 때문에 그 경우를 처리합니다.


답변

이 답변에inf 따라 배열 dtypes가 부동 소수점 인 경우에만을 기준으로 바꿀 수도 있습니다 .

>>> 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.])


답변

관련 질문을 검색하면서 찾은 한 가지 대답은 분모가 0인지 아닌지에 따라 출력을 조작하는 것입니다.

가정 arrayAarrayB초기화되었지만, arrayB일부 0을 가지고있다. arrayC = arrayA / arrayB안전하게 계산하려면 다음을 수행 할 수 있습니다.

이 경우 셀 중 하나에서 0으로 나누기를 할 때마다 셀을으로 설정합니다 myOwnValue.이 경우에는 0이됩니다.

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]0으로 인스턴스화 되었으므로 어쨌든 불필요 합니다. 그러나 만약 그렇다면 myOwnValue != 0이 작업은 뭔가를 할 것입니다.