HOWTO · NumPy

NumPy에서 절대 값 계산

NumPy, abs() 함수, numpy.absolute() 함수 및 numpy.abs() 함수에서 절대 값을 계산하는 데 사용할 수있는 3 가지 방법이 있습니다.

이 페이지의 내용

절댓값을 계산하는 것은 데이터 분석과 과학 컴퓨팅의 기본 연산입니다. Python에서는 NumPy 라이브러리가 배열과 수치 데이터에 대해 이 연산을 효율적으로 수행하는 방법을 제공합니다. 단순한 숫자 리스트를 다루든 복잡한 다차원 배열을 다루든, 절댓값을 계산하는 방법을 이해하면 데이터 조작 능력을 향상시킬 수 있습니다.

이 글에서는 NumPy에서 절댓값을 계산하는 세 가지 주요 방법인 abs() 함수, numpy.absolute(), numpy.abs()를 살펴봅니다. 이 세 가지는 밀접하게 관련되어 있습니다. NumPy 배열에 대해서는 모두 동일한 원소별 연산을 실행합니다. 따라서 이 가이드는 실제로 어디가 다른지, 즉 각 방법이 어떤 입력을 받는지와 NumPy 함수가 어떤 추가 제어를 제공하는지에 초점을 맞춥니다.

내장 함수 abs() 사용하기

abs() 함수는 숫자의 절댓값을 반환하는 Python 내장 함수입니다. NumPy 전용은 아니지만 NumPy 배열에서도 동작합니다. 배열에 abs()를 적용하면 Python은 배열의 __abs__() 메서드를 호출하는데, 이는 NumPy 자체의 절댓값 연산이며, 원래 원소들의 절댓값을 담은 새 배열을 얻게 됩니다.

NumPy와 함께 abs() 함수를 사용하는 방법은 다음과 같습니다.

import numpy as np

array = np.array([-1, -2, 3, -4])
absolute_values = abs(array)

print(absolute_values)

출력:

[1 2 3 4]

abs()는 단순히 배열의 __abs__() 메서드로 호출을 전달하므로, 배열에 대해서는 numpy.absolute()와 정확히 동일한 계산을 수행합니다. NumPy 데이터에 내장 함수를 사용해도 성능상의 불이익은 전혀 없습니다. 진짜 한계는 다른 곳에 있습니다. abs()는 __abs__()를 정의한 객체가 필요합니다. Python 숫자, 복소수, NumPy 배열에서는 동작하지만, 평범한 Python 리스트에 abs()를 호출하면 TypeError가 발생합니다. 반면 아래의 NumPy 함수들은 리스트를 직접 받습니다.

numpy.absolute() 사용하기

numpy.absolute()는 ufunc로 구현된 NumPy 자체의 절댓값 함수입니다. 모든 모양과 크기의 배열에 대해 원소별로 절댓값을 계산하며, 내장 함수와 달리 평범한 리스트 같은 배열 유사 입력도 받아 먼저 배열로 변환합니다. ufunc이므로 일반적인 ufunc 매개변수도 받습니다. 예를 들어 out=를 사용하면 결과를 기존 배열에 쓸 수 있습니다.

numpy.absolute()를 사용하는 예는 다음과 같습니다.

import numpy as np

array = np.array([[-1, -2, 3], [-4, 5, -6]])
absolute_values = np.absolute(array)

print(absolute_values)

출력:

[[1 2 3]
 [4 5 6]]

numpy.absolute()는 복소수도 지원하며 각 원소의 크기를 반환합니다.

import numpy as np

complex_array = np.array([3 + 4j, -5 + 12j])
magnitudes = np.absolute(complex_array)

print(magnitudes)

출력:

[ 5. 13.]

덕분에 데이터가 다차원이거나 복소수일 수 있는 과학 컴퓨팅에서 안전한 기본 선택이 됩니다.

numpy.abs() 사용하기

numpy.abs()는 전혀 별개의 구현이 아닙니다. numpy.absolute()와 정확히 동일한 함수 객체입니다. NumPy에서 np.abs is np.absolute는 True로 평가됩니다. 더 짧은 이름은 순전히 편의용 별칭으로 존재합니다.

numpy.abs()를 사용하는 방법은 다음과 같습니다.

import numpy as np

array = np.array([[1, -2], [-3, 4]])
absolute_values = np.abs(array)

print(absolute_values)

출력:

[[1 2]
 [3 4]]

두 이름이 하나의 함수를 가리키므로, numpy.abs()와 numpy.absolute() 중 무엇을 선택할지는 코드베이스에서의 스타일이나 가독성의 문제일 뿐입니다. 결과와 성능은 어느 쪽이든 동일합니다.

결론

NumPy에서 절댓값을 계산하는 것은 간단합니다. 세 가지 방법 모두 배열에 대해 동일한 원소별 연산을 수행하기 때문입니다. 값이 이미 NumPy 배열이거나 평범한 숫자이고 일반적인 Python 코드를 원한다면 내장 abs()를 사용하고, 리스트 같은 배열 유사 데이터나 out= 같은 ufunc 옵션을 전달해야 한다면 numpy.absolute() 또는 그 별칭인 numpy.abs()를 선택하세요. 어떤 표기를 선택하든 반환되는 숫자는 같습니다.

자주 묻는 질문

  1. abs()와 numpy.absolute()의 차이는 무엇인가요?
    계산이 아니라 인터페이스입니다. NumPy 배열에 대해 abs()는 배열의 __abs__() 메서드를 호출하는데, 이는 numpy.absolute()가 수행하는 것과 동일한 연산입니다. numpy.absolute()는 여기에 더해 리스트 같은 배열 유사 입력과 out= 같은 ufunc 매개변수를 받습니다. 반면 abs()는 리스트가 __abs__()를 정의하지 않으므로 평범한 리스트에 대해 TypeError를 발생시킵니다.

  2. numpy.abs()를 복소수에 사용할 수 있나요?
    네. 세 가지 방법 모두 복소수의 크기를 반환합니다. 예를 들어 3 + 4j와 -5 + 12j의 절댓값은 5.0과 13.0이며, 위의 numpy.absolute() 예에 나와 있습니다.

  3. 이 방법들 사이에 성능 차이가 있나요?
    의미 있는 차이는 없습니다. numpy.abs()와 numpy.absolute()는 동일한 함수 객체이고, 배열에 대한 abs()는 동일한 NumPy 연산으로 디스패치되므로, 세 가지 모두 동일한 원소별 작업을 수행합니다. 차이는 호출 오버헤드뿐이며 그마저도 무시할 수준입니다.

  4. 다차원 배열에는 어떤 방법을 사용해야 하나요?
    어느 것이든 됩니다. 위의 2차원 예가 보여주듯이 세 가지 모두 모든 모양의 배열을 처리합니다. 입력이 리스트나 다른 배열 유사 객체일 수 있다면, 내장 abs()는 __abs__()를 정의한 객체만 받으므로 numpy.absolute()나 numpy.abs()를 선호하세요.

  5. 이 함수들을 사용할 때 출력에 차이가 있나요?
    아니요. 동일한 입력에 대해 세 가지 방법 모두 같은 값을 반환합니다.