HOWTO · NumPy

Python NumPy의 Element-Wise Division

Python의 NumPy 배열에서 요소 별 분할을 수행하는 데 사용할 수있는 두 가지 주요 메서드, numpy.divide() 함수 및 / 연산자가 있습니다.

이 페이지의 내용

NumPy 배열에서 서로 대응하는 값을 나누려면 numpy.divide(x1, x2) 또는 x1 / x2를 사용합니다. 두 방법 모두 요소별 실수 나눗셈을 수행하고 배열을 반환합니다. 결과를 제어하는 데 out이나 where 같은 선택 인수가 유용하다면 함수 형식을 사용하세요.

numpy.divide() 사용하기

numpy.divide()는 피제수를 먼저, 제수를 다음에 받습니다. 모양이 같은 배열에서는 첫 번째 배열의 각 값을 두 번째 배열의 같은 위치에 있는 값으로 나눕니다. 반환된 배열을 나중에 사용하려면 변수에 할당하세요. out 인수는 선택 사항입니다. 생략하면 NumPy가 결과 배열을 새로 만들어 반환하고, 결과를 기존 저장 공간에 넣으려면 모양과 자료형이 호환되는 배열을 전달하면 됩니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import numpy as np

numerators = np.array([12, 18, 24])
denominators = np.array([3, 6, 8])
by_function = np.divide(numerators, denominators)
destination = np.array([0.0, 0.0, 0.0])
np.divide(numerators, denominators, out=destination)
by_operator = numerators / denominators
print(by_function)
print(by_operator)
print(destination)
[4. 3. 3.]
[4. 3. 3.]
[4. 3. 3.]

첫 번째 함수 호출은 out을 생략하므로 새 배열을 만들어 반환합니다. 두 번째 호출은 결과와 모양 및 자료형이 같도록 만든 destination에 결과를 기록합니다. 연산자도 같은 입력을 사용하므로 세 배열에 담긴 몫은 모두 같습니다. 입력은 정수지만 실수 나눗셈 결과는 부동소수점 값입니다.

/ 연산자 사용하기

대부분의 식에서는 /가 NumPy 배열을 요소별로 나누는 가장 간결하고 명확한 방법입니다. result = numerators / denominators처럼 작성하면 각 위치의 피연산자끼리 계산합니다. 결과 배열은 변수에 할당하거나, 인덱싱하거나, 다른 NumPy 연산에 전달할 수 있습니다. 한쪽 피연산자가 스칼라이거나 두 배열의 모양이 호환되면 NumPy의 배열 산술 규칙이 적용됩니다.

이 연산자는 별도의 정수 나눗셈 연산이 아닙니다. 정수 배열에 /를 사용해도 실수 나눗셈을 수행하며 몫은 부동소수점 값으로 표현됩니다. 이는 바닥 나눗셈을 요청하는 Python의 //와 다릅니다. 원하는 연산에 따라 연산자를 선택하고, 소수 몫이 필요하다면 //를 사용하지 마세요.

브로드캐스팅, 자료형, 0으로 나누기

모양이 같은 배열은 서로 대응하는 요소끼리 바로 나눕니다. NumPy는 호환되는 모양을 브로드캐스팅하기도 합니다. 차원을 오른쪽부터 비교하며, 각 차원 쌍은 크기가 같거나 둘 중 하나가 1이어야 합니다. 예를 들어 모양이 (2, 3)인 2차원 배열을 (3,) 모양의 1차원 배열로 나누면 각 행에 같은 제수 배열이 적용됩니다. 브로드캐스팅 규칙에 맞지 않는 모양의 배열은 요소별로 나눌 수 없습니다. 모양 불일치가 발생하면 두 피연산자의 array.shape를 확인하세요.

결과 자료형은 입력 자료형과 나눗셈 연산에 따라 달라집니다. 특히 /나 numpy.divide()에 정수 입력을 주면 각 몫을 정수로 잘라내는 대신 실수 나눗셈 결과를 만듭니다. 이후 단계에서 특정 자료형이 필요하다면 나눗셈 후에 의도적으로 변환하고, 그 과정에서 소수 부분이 사라지는지 확인하세요.

실수 나눗셈에서는 /와 numpy.divide() 모두 정수 입력으로 부동소수점 결과를 만듭니다. 따라서 제수가 0이면 분자가 0이 아닌 경우 무한대가, 0 / 0인 경우 nan이 생성될 수 있으며 런타임 경고도 발생합니다. 부동소수점 입력에서도 같은 현상이 나타날 수 있습니다. 이 문서에서 다루는 것은 실수 나눗셈이며, //를 사용하는 바닥 나눗셈은 다른 연산이므로 여기서 설명하는 동작에 해당하지 않습니다. 제수가 0인 위치를 계산에서 제외하려면 먼저 출력 배열을 초기화한 다음 numpy.divide(a, b, out=result, where=b != 0)를 사용하세요. 조건이 거짓인 위치에는 초기화된 값이 그대로 남습니다. 이후 계산에 적합한 채움 값을 선택하고, 제외된 위치를 어떻게 처리할지도 별도로 정하세요.

나눗셈 방법 선택하기

간결한 요소별 몫을 바로 구하려면 /를 사용하세요. 기존 결과 배열을 지정하는 out이나 계산할 위치를 선택하는 where처럼 함수 인수가 유용하다면 numpy.divide()를 사용하세요. 어느 방법을 쓰든 피연산자의 모양이 호환되는지 확인하고, 데이터의 자료형에서 제수가 0인 경우를 어떻게 처리할지 정하세요. 이렇게 확인하면 벡터, 행렬, 브로드캐스팅 가능한 입력에 맞게 코드를 조정하기 쉽습니다.