HOWTO · NumPy

NumPy 단위 벡터

파이썬에서 NumPy 배열을 단위 벡터로 정규화하는 데 사용할 수있는 두 가지 주요 방법, numpy.linalg.norm() 함수 및 자체 정의 접근 방식이 있습니다.

이 페이지의 내용

0이 아닌 NumPy 벡터를 유클리드 노름으로 나누면 정규화할 수 있습니다: unit_vector = vector / np.linalg.norm(vector). [3.0, 4.0]의 결과는 [0.6, 0.8]입니다.

단위 벡터 정의하기

1차원 NumPy 배열을 단위 벡터로 만들려면 각 성분을 벡터의 유클리드 노름으로 나눕니다.

u = v / ||v||

단위 벡터의 크기는 1입니다. 노름으로 나누면 방향은 유지하면서 벡터의 길이가 바뀝니다. 벡터에 양의 스칼라를 곱해도 정규화된 방향은 같지만, 음의 스칼라를 곱하면 방향이 반대로 바뀝니다. 따라서 원래 크기보다 방향에 따라 계산해야 할 때 유용합니다.

numpy.linalg.norm()로 정규화하기

NumPy의 numpy.linalg.norm()는 1차원 배열에서 기본적으로 유클리드 노름을 계산합니다. 다음 예제에서는 배열을 만들고 노름으로 나눈 다음, 정규화된 성분을 출력합니다.

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

import numpy as np

vector = np.array([3.0, 4.0])
unit_vector = vector / np.linalg.norm(vector)
print(unit_vector)
[0.6 0.8]

이 입력의 노름은 5이므로 각 성분을 5로 나눕니다. 결과에 소수 성분이 필요하면 부동소수점 입력을 사용하세요. 결과는 입력과 같은 1차원 형태를 갖습니다.

노름을 직접 계산하기

성분이 v[i]인 벡터 v의 유클리드 노름은 각 성분을 제곱해 더한 값의 제곱근입니다. NumPy에서는 이를 sqrt(sum(v ** 2))로 계산할 수 있으며, 그 값으로 벡터를 나누면 같은 정규화 공식을 적용할 수 있습니다. 이 방법은 수학적 계산 단계를 직접 보여 주므로 계산을 배우거나 응용할 때 유용합니다.

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

import numpy as np

vector = np.array([3.0, 4.0])
norm = np.sqrt(np.sum(vector ** 2))
unit_vector = vector / norm
print(unit_vector)

여기서 보인 직접 계산 공식은 일반적인 1차원 실수 벡터를 위한 것입니다. 복소수 배열이나 다른 노름 정의를 사용할 때는 성분을 제곱하면 의도한 크기가 나온다고 가정하지 말고, 적절한 NumPy 연산을 사용하세요.

영벡터와 입력 형태 처리하기

모든 성분이 0인 벡터의 노름은 0입니다. 이 노름으로 나누는 것은 정의되지 않으며, 방향이 없는 영벡터는 단위 벡터로 정규화할 수 없습니다. 재사용할 함수에서는 ValueError를 발생시키거나, 호출 코드에서 정규화 전에 해당 입력을 처리하는 등 명시적인 정책을 정하세요. 원래 영벡터를 그대로 반환하면 나눗셈은 피할 수 있지만, 그 벡터가 단위 벡터가 되는 것은 아닙니다.

위 예제는 (n,) 형태의 벡터 하나를 대상으로 합니다. 배열에 여러 벡터가 들어 있다면 배열의 형태와 노름 계산에 전달하는 축에 따라 정규화 대상이 결정됩니다. 예를 들어 2차원 배열은 벡터를 행이나 열로 저장할 수 있습니다. 각 벡터를 나타내는 축을 선택하고 브로드캐스팅을 사용해 각 행이나 열을 해당 노름으로 나누세요. 의도한 수학적 연산이 아니라면 행렬 전체를 벡터 하나처럼 정규화하지 마세요.

결과 확인 및 방법 선택하기

0이 아닌 입력을 정규화한 뒤에는 부동소수점 반올림을 고려해 벡터의 노름이 대략 1인지 확인하세요. 1차원 벡터라면 코드에서 np.isclose(np.linalg.norm(unit_vector), 1.0)을 사용할 수 있습니다. 반올림된 성분의 노름은 정확히 1이 아니라 매우 가까운 값일 수 있으므로, 대부분의 부동소수점 계산에서 정확한 동등 비교는 적절하지 않습니다.

일반적인 NumPy 작업에는 numpy.linalg.norm()를 사용하세요. 의도가 명확하고 다른 작업에 맞춰 노름 동작을 선택할 수 있습니다. 유클리드 계산을 설명하거나 각 단계를 직접 확인해야 할 때는 제곱합의 제곱근 공식을 사용하세요. 두 방법 모두 노름이 0이 아니어야 하며, 어느 방법도 영벡터를 단위 벡터로 만들지는 못합니다. 여러 벡터를 다룰 때는 입력 형태와 정규화 축을 명시하세요.