[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])
답변
다른 답변을 바탕으로 다음을 개선합니다.
0/0
추가invalid='ignore'
하여 처리numpy.errstate()
- 도입
numpy.nan_to_num()
변환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]
답변
한 줄짜리 (경고 발생)
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인지 아닌지에 따라 출력을 조작하는 것입니다.
가정 arrayA
및 arrayB
초기화되었지만, 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
이 작업은 뭔가를 할 것입니다.