API · NumPy

Python Numpy.linalg.norm() 함수

numpy.linalg.norm()가 벡터 노름과 행렬 노름을 계산하는 방법과 ord, axis, keepdims가 결과에 미치는 영향을 알아봅니다.

이 페이지의 내용

배열의 노름을 계산하려면 numpy.linalg.norm()을 사용합니다. 입력의 형태와 인수에 따라 벡터 노름, 행렬 노름 또는 선택한 축을 따라 계산한 여러 노름을 구할 수 있습니다. ord 인수는 노름의 정의를 선택하며, 입력을 벡터로 다룰지 행렬로 다룰지를 결정하지는 않습니다.

numpy.linalg.norm()의 구문과 매개변수

함수의 시그니처는 다음과 같습니다.

numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
  • x는 노름을 계산할 배열형 입력입니다.
  • ord는 노름의 정의를 선택합니다. 기본값인 None을 사용하면 벡터에는 유클리드 노름을, 행렬에는 프로베니우스 노름을 적용합니다. 지원되는 값은 벡터 노름을 계산하는지 행렬 노름을 계산하는지에 따라 다릅니다. 전체 목록은 NumPy 참조 문서를 확인하세요.
  • axis는 계산에 사용할 축을 지정합니다. 정수 하나를 지정하면 해당 축을 따라 벡터 노름을 계산합니다. 정수 두 개로 된 튜플을 지정하면 해당 두 축을 기준으로 행렬 노름을 계산합니다. axis=None과 ord=None을 함께 사용하면 입력을 평탄화한 뒤 노름을 계산하며, 이는 차원이 2보다 큰 입력에도 해당합니다. 고차원 입력에서 특정 벡터 노름을 구하려면 정수 axis를, 각 나머지 슬라이스에서 특정 행렬 노름을 구하려면 두 축으로 된 튜플을 전달하세요.
  • keepdims의 기본값은 False입니다. True로 설정하면 계산에 사용한 축이 결과에서 크기 1인 차원으로 유지되어 원래 배열과 브로드캐스팅할 때 유용할 수 있습니다.

축을 선택하지 않으면 벡터 또는 행렬 노름의 결과는 스칼라입니다. axis로 여러 슬라이스를 선택하면 각 슬라이스의 노름을 담은 배열이 반환됩니다. keepdims=True이면 축소된 축이 크기 1인 차원으로 남습니다.

벡터 노름과 행렬 노름 계산

1차원 입력의 기본값은 유클리드 벡터 노름으로, 각 원소를 제곱해 더한 뒤 제곱근을 취합니다. 2차원 입력의 기본값은 프로베니우스 행렬 노름으로, 행렬의 모든 원소에 같은 계산을 적용합니다. 다음 독립 예제에서 두 계산을 모두 확인할 수 있습니다.

import numpy as np

vector = np.array([3, 4])
matrix = np.array([[3, 4], [0, 12]])

print(np.linalg.norm(vector))
print(np.linalg.norm(matrix))
5.0
13.0

첫 번째 스칼라는 벡터 [3, 4]의 유클리드 노름입니다. 두 번째는 행렬의 네 원소를 모두 대상으로 계산한 프로베니우스 노름입니다.

ord로 노름 선택하기

벡터에서는 ord로 2에 해당하는 유클리드 노름, 절댓값의 합인 1 노름, 절댓값이 가장 큰 원소를 선택하는 np.inf 같은 정의를 지정할 수 있습니다. 행렬에서는 ord="fro"가 프로베니우스 노름을, ord="nuc"가 핵 노름을 선택합니다. 핵 노름은 행렬의 특잇값을 모두 더한 값입니다. 올바른 표기는 nuc이며 nuuc는 지원되는 별칭이 아닙니다.

아래 예제는 같은 행렬의 프로베니우스 노름과 핵 노름을 비교합니다.

import numpy as np

matrix = np.array([[1, 2], [3, 4]])
print(np.linalg.norm(matrix, ord="fro"))
print(np.linalg.norm(matrix, ord="nuc"))
5.477225575051661
5.8309518948453

첫 번째 값은 프로베니우스 노름이고, 두 번째 값은 행렬의 특잇값을 더한 핵 노름입니다.

행렬 계산에는 행렬용 ord 값을 선택하세요. 입력의 차원이 2보다 크고 벡터 노름이나 행렬 노름을 구하려는 경우에는 축을 명시적으로 선택해야 합니다. 지원되는 조합은 선택한 노름의 정의와 NumPy 버전에 따라 달라집니다.

축을 선택하고 차원 유지하기

(rows, columns) 형태의 배열에서 axis=0은 각 열의 벡터 노름을 계산하고, axis=1은 각 행의 벡터 노름을 계산합니다. 두 차원 전체에 대한 행렬 노름을 계산하려면 axis=(0, 1)을 전달하세요.

import numpy as np

matrix = np.array([[3, 4], [0, 12]])
print(np.linalg.norm(matrix, axis=0))
print(np.linalg.norm(matrix, axis=1))
print(np.linalg.norm(matrix, axis=(0, 1), keepdims=True).shape)
[ 3.         12.64911064]
[ 5. 12.]
(1, 1)

첫 번째 배열에는 두 열의 벡터 노름이, 두 번째 배열에는 두 행의 벡터 노름이 들어 있습니다. 마지막 튜플은 keepdims=True로 계산한 행렬 노름 결과의 형태입니다. 축소된 축이 크기 1인 차원으로 유지되어 이후 브로드캐스팅에 사용할 수 있습니다. 고차원 배열에서는 각 벡터 또는 행렬 슬라이스를 구성하는 축을 선택하세요.