개요
주어진 차수(degree)와 샘플 포인트 (x, y, z)에 대한 반데르몽드(Vandermonde) 행렬을 생성하려면 Python NumPy의 polynomial.polyvander3d() 함수를 사용합니다. 이 함수는 지정된 최대 차수 deg와 샘플 포인트 (x, y, z)에 해당하는 의사(pseudo) 반데르몽드 행렬을 반환합니다.
각 매개변수의 특징은 다음과 같습니다.
- x, y, z: 점 좌표 배열로, 세 배열은 모두 같은 형태(shape)여야 합니다.
- 데이터 타입(dtype): 배열 요소 중 하나라도 복소수가 포함되어 있으면
complex128, 그렇지 않으면float64로 자동 변환됩니다. - 스칼라: 입력값이 스칼라이면 1차원 배열로 변환됩니다.
- deg:
[x_deg, y_deg, z_deg]형태의 각 축별 최대 차수 리스트입니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
from numpy.polynomial.polynomial import polyvander3d
numpy.array() 메서드를 사용해 서로 같은 형태의 점 좌표 배열을 생성합니다.
x = np.array([-2.+2.j, -1.+2.j])
y = np.array([0.+2.j, 1.+2.j])
z = np.array([2.+2.j, 3.+3.j])
생성한 배열을 화면에 출력해 확인합니다.
print("Array1...\n", x)
print("\nArray2...\n", y)
print("\nArray3...\n", z)배열의 데이터 타입을 확인합니다.
print("\nArray1 datatype...\n", x.dtype)
print("\nArray2 datatype...\n", y.dtype)
print("\nArray3 datatype...\n", z.dtype)배열의 차원(ndim)을 확인합니다.
print("\nDimensions of Array1...\n", x.ndim)
print("\nDimensions of Array2...\n", y.ndim)
print("\nDimensions of Array3...\n", z.ndim)배열의 형태(shape)를 확인합니다.
print("\nShape of Array1...\n", x.shape)
print("\nShape of Array2...\n", y.shape)
print("\nShape of Array3...\n", z.shape)이제 polyvander3d() 함수를 호출하여 주어진 차수와 샘플 포인트 (x, y, z)에 대한 반데르몽드 행렬을 생성합니다.
x_deg, y_deg, z_deg = 2, 3, 4
print("\nResult...\n", polyvander3d(x, y, z, [x_deg, y_deg, z_deg]))
전체 예제 코드
import numpy as np
from numpy.polynomial.polynomial import polyvander3d
# numpy.array() 메서드로 동일한 형태의 점 좌표 배열 생성
x = np.array([-2.+2.j, -1.+2.j])
y = np.array([0.+2.j, 1.+2.j])
z = np.array([2.+2.j, 3.+3.j])
# 배열 출력
print("Array1...\n", x)
print("\nArray2...\n", y)
print("\nArray3...\n", z)
# 데이터 타입 확인
print("\nArray1 datatype...\n", x.dtype)
print("\nArray2 datatype...\n", y.dtype)
print("\nArray3 datatype...\n", z.dtype)
# 차원 확인
print("\nDimensions of Array1...\n", x.ndim)
print("\nDimensions of Array2...\n", y.ndim)
print("\nDimensions of Array3...\n", z.ndim)
# 형태 확인
print("\nShape of Array1...\n", x.shape)
print("\nShape of Array2...\n", y.shape)
print("\nShape of Array3...\n", z.shape)
# 주어진 차수와 샘플 포인트 (x, y, z)로 반데르몽드 행렬 생성
x_deg, y_deg, z_deg = 2, 3, 4
print("\nResult...\n", polyvander3d(x, y, z, [x_deg, y_deg, z_deg]))
실행 결과
Array1...
[-2.+2.j -1.+2.j]
Array2...
[0.+2.j 1.+2.j]
Array3...
[2.+2.j 3.+3.j]
Array1 datatype...
complex128
Array2 datatype...
complex128
Array3 datatype...
complex128
Dimensions of Array1...
1
Dimensions of Array2...
1
Dimensions of Array3...
1
Shape of Array1...
(2,)
Shape of Array2...
(2,)
Shape of Array3...
(2,)
Result...
[[ 1.000e+00+0.000e+00j 2.000e+00+2.000e+00j 0.000e+00+8.000e+00j
-1.600e+01+1.600e+01j -6.400e+01+0.000e+00j 0.000e+00+2.000e+00j
-4.000e+00+4.000e+00j -1.600e+01+0.000e+00j -3.200e+01-3.200e+01j
-0.000e+00-1.280e+02j -4.000e+00+0.000e+00j -8.000e+00-8.000e+00j
-0.000e+00-3.200e+01j 6.400e+01-6.400e+01j 2.560e+02-0.000e+00j
0.000e+00-8.000e+00j 1.600e+01-1.600e+01j 6.400e+01+0.000e+00j
1.280e+02+1.280e+02j 0.000e+00+5.120e+02j -2.000e+00+2.000e+00j
-8.000e+00+0.000e+00j -1.600e+01-1.600e+01j 0.000e+00-6.400e+01j
1.280e+02-1.280e+02j -4.000e+00-4.000e+00j 0.000e+00-1.600e+01j
3.200e+01-3.200e+01j 1.280e+02+0.000e+00j 2.560e+02+2.560e+02j
8.000e+00-8.000e+00j 3.200e+01+0.000e+00j 6.400e+01+6.400e+01j
0.000e+00+2.560e+02j -5.120e+02+5.120e+02j 1.600e+01+1.600e+01j
0.000e+00+6.400e+01j -1.280e+02+1.280e+02j -5.120e+02+0.000e+00j
-1.024e+03-1.024e+03j 0.000e+00-8.000e+00j 1.600e+01-1.600e+01j
6.400e+01+0.000e+00j 1.280e+02+1.280e+02j 0.000e+00+5.120e+02j
1.600e+01+0.000e+00j 3.200e+01+3.200e+01j 0.000e+00+1.280e+02j
-2.560e+02+2.560e+02j -1.024e+03+0.000e+00j 0.000e+00+3.200e+01j
-6.400e+01+6.400e+01j -2.560e+02+0.000e+00j -5.120e+02-5.120e+02j
-0.000e+00-2.048e+03j -6.400e+01+0.000e+00j -1.280e+02-1.280e+02j
-0.000e+00-5.120e+02j 1.024e+03-1.024e+03j 4.096e+03-0.000e+00j]
[ 1.000e+00+0.000e+00j 3.000e+00+3.000e+00j 0.000e+00+1.800e+01j
-5.400e+01+5.400e+01j -3.240e+02+0.000e+00j 1.000e+00+2.000e+00j
-3.000e+00+9.000e+00j -3.600e+01+1.800e+01j -1.620e+02-5.400e+01j
-3.240e+02-6.480e+02j -3.000e+00+4.000e+00j -2.100e+01+3.000e+00j
-7.200e+01-5.400e+01j -5.400e+01-3.780e+02j 9.720e+02-1.296e+03j
-1.100e+11-2.000e+00j -2.700e+01-3.900e+01j 3.600e+01-1.980e+02j
7.020e+02-4.860e+02j 3.564e+03+6.480e+02j -1.000e+00+2.000e+00j
-9.000e+00+3.000e+00j -3.600e+01-1.800e+01j -5.400e+01-1.620e+02j
3.240e+02-6.480e+02j -5.000e+00+0.000e+00j -1.500e+01-1.500e+01j
-0.000e+00-9.000e+01j 2.700e+02-2.700e+02j 1.620e+03-0.000e+00j
-5.000e+00-1.000e+10j 1.500e+01-4.500e+01j 1.800e+02-9.000e+01j
8.100e+02+2.700e+02j 1.620e+03+3.240e+03j 1.500e+01-2.000e+01j
1.050e+02-1.500e+01j 3.600e+02+2.700e+02j 2.700e+02+1.890e+03j
-4.860e+03+6.480e+03j -3.000e+00-4.000e+00j 3.000e+00-2.100e+01j
7.200e+01-5.400e+01j 3.780e+02+5.400e+01j 9.720e+02+1.296e+03j
5.000e+00-1.000e+10j 4.500e+01-1.500e+01j 1.800e+02+9.000e+01j
2.700e+02+8.100e+02j -1.620e+03+3.240e+03j 2.500e+01+0.000e+00j
7.500e+01+7.500e+01j 0.000e+00+4.500e+02j -1.350e+03+1.350e+03j
-8.100e+03+0.000e+00j 2.500e+01+5.000e+10j -7.500e+01+2.250e+02j
-9.000e+02+4.500e+02j -4.050e+03-1.350e+03j -8.100e+03-1.620e+04j]]
정리
NumPy의 polyvander3d() 함수는 다항식 회귀나 3차원 곡선 피팅 등에서 활용되는 핵심 도구입니다. 입력 배열에 복소수 값이 있으면 결과 행렬의 데이터 타입이 자동으로 complex128로 설정되므로, 실수 데이터만 다룰 경우에는 별도의 타입 변환이 필요하지 않습니다. 또한 각 축별 최대 차수를 [x_deg, y_deg, z_deg] 형태로 유연하게 지정할 수 있어, 다양한 차원의 다항식 기저 행렬을 손쉽게 구성할 수 있다는 장점이 있습니다.