programing

0으로 나누기 0을 반환하는 방법

lovejava 2023. 6. 13. 21:52

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-loop을 사용할 수 있었지만, numpy의 최적화를 실제로 활용하기 위해서는 오류를 무시하는 대신 0으로 나눗셈할 때 0을 반환하는 나눗셈 함수가 필요합니다.

제가 뭔가를 놓치고 있는 것이 아니라면, 그것은 어지러울 것 같지 않습니다.seterr()는 오류 발생 시 값을 반환할 수 있습니다.오류 처리를 제로로 하여 나만의 분수를 설정하면서 numpy를 최대한 활용할 수 있는 방법에 대해 다른 제안이 있습니까?

numpy v1.7+에서는 ufuncs에 대한 "위치" 옵션을 활용할 수 있습니다.당신은 한 줄로 일을 할 수 있고 errstate context manager를 상대할 필요가 없습니다.

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

이 경우 b가 0과 같지 않은 '어디서나' 나눗셈 계산을 수행합니다.b가 0일 때는 'out' 인수에서 원래 지정한 값과 동일하게 유지됩니다.

@Frank Dernoncourt의 답변을 바탕으로 -1/0과 스칼라 버그 수정:

def div0( a, b, fill=np.nan ):
    """ a / b, divide by 0 -> `fill`
        div0( [-1, 0, 1], 0, fill=np.nan) -> [nan nan nan]
        div0( 1, 0, fill=np.inf ) -> inf
    """
    with np.errstate(divide='ignore', invalid='ignore'):
        c = np.true_divide( a, b )
    if np.isscalar( c ):
        return c if np.isfinite( c ) \
            else fill
    else:
        c[ ~ np.isfinite( c )] = fill
        return c

다른 답변을 기반으로 다음을 개선합니다.

  • 0/0추가를 통한 처리invalid='ignore'에게
  • 변환 소개np.nan로.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]

사용되지 않음(PYthon 2 솔루션):

원라이너(투구 경고)

np.nan_to_num(array1 / array2)

두 단계로 나눠서 해보세요.먼저 분열한 다음 교체합니다.

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

numpy.errstate라인은 선택 사항이며, 이미 의도하고 있기 때문에 0으로 나누는 "오류"에 대해 numpy가 말하는 것을 방지할 뿐입니다.

다음을 기준으로 바꿀 수도 있습니다.inf다음 답변에 따라 배열된 d타입이 부동인 경우에만:

>>> 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인지 아닌지를 기준으로 출력을 조작하는 것이었습니다.

가정하다arrayA그리고.arrayB초기화되었지만arrayB0이 몇 개 있습니다.계산을 하려면 다음을 수행할 수 있습니다.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이 수술은 뭔가를 할 것입니다.

언급할 가치가 있는 또 다른 솔루션:

>>> a = np.array([1,2,3], dtype='float')
>>> b = np.array([0,1,3], dtype='float')
>>> b_inv = np.array([1/i if i!=0 else 0 for i in b])
>>> a*b_inv
array([0., 2., 1.])

언급URL : https://stackoverflow.com/questions/26248654/how-to-return-0-with-divide-by-zero