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
초기화되었지만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
이 수술은 뭔가를 할 것입니다.
언급할 가치가 있는 또 다른 솔루션:
>>> 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
'programing' 카테고리의 다른 글
.NET EXE를 읽을 수 있는 C# 소스 코드로 압축 해제하려면 어떻게 해야 합니까? (0) | 2023.06.13 |
---|---|
-std=c99를 사용하는 GCC가 구조 시간 사양을 모른다고 불만을 제기합니다. (0) | 2023.06.13 |
Oracle - 두 DateTime 열 간의 차이를 분 단위로 파악하는 데 가장 적합한 SELECT 문은 무엇입니까? (0) | 2023.06.13 |
jinja2에서 파이썬 함수 호출 (0) | 2023.06.13 |
Vue 2.7과 함께 Vue 4 사용 (0) | 2023.06.13 |