Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy polyvander3d()로 3차원 의사-반데르몬드 행렬 생성하는 방법

Python NumPy에서 polynomial.polyvander3d() 함수를 사용하면 주어진 차수와 샘플 포인트 (x, y, z)에 대한 반데르몬드(Vandermonde) 행렬을 손쉽게 생성할 수 있습니다. 이 함수는 지정된 차수 deg와 샘플 포인트 (x, y, z)에 대응하는 의사-반데르몬드(pseudo-Vandermonde) 행렬을 반환하며, 다항식 회귀나 다차원 데이터 피팅 작업에서 유용하게 활용됩니다.

주요 매개변수

x, y, z — 점 좌표를 담고 있는 배열로, 세 배열은 모두 동일한 형태(shape)를 가져야 합니다. 요소 중 하나라도 복소수가 포함되어 있으면 dtype은 complex128로, 그렇지 않으면 float64로 자동 변환됩니다. 스칼라 값이 입력되면 1차원 배열로 변환됩니다.

deg — [x_deg, y_deg, z_deg] 형태의 리스트로, 각 축(x, y, z)별 최대 차수를 지정합니다.

구현 단계

먼저 필요한 라이브러리를 임포트합니다.

import numpy as np
from numpy.polynomial.polynomial import polyvander3d

numpy.array() 메서드를 사용하여 동일한 형태의 점 좌표 배열을 생성합니다.

x = np.array([1.5, 2.3])
y = np.array([3.7, 4.4])
z = np.array([5.3, 6.6])

생성한 배열들을 화면에 출력합니다.

print("Array1...\n",x)
print("\nArray2...\n",y)
print("\nArray3...\n",z)

배열의 데이터 타입(dtype)을 확인합니다.

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([1.5, 2.3])
y = np.array([3.7, 4.4])
z = np.array([5.3, 6.6])

# 배열 출력
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)

# polyvander3d()로 반데르몬드 행렬 생성
x_deg, y_deg, z_deg = 2, 3, 4
print("\nResult...\n",polyvander3d(x,y, z, [x_deg, y_deg, z_deg]))

실행 결과

Array1...
[1.5 2.3]

Array2...
[3.7 4.4]

Array3...
[5.3 6.6]

Array1 datatype...
float64

Array2 datatype...
float64

Array3 datatype...
float64

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.00000000e+00 5.30000000e+00 2.80900000e+01 1.48877000e+02
7.89048100e+02 3.70000000e+00 1.96100000e+01 1.03933000e+02
5.50844900e+02 2.91947797e+03 1.36900000e+01 7.25570000e+01
3.84552100e+02 2.03812613e+03 1.08020685e+04 5.06530000e+01
2.68460900e+02 1.42284277e+03 7.54106668e+03 3.99676534e+04
1.50000000e+00 7.95000000e+00 4.21350000e+01 2.23315500e+02
1.18357215e+03 5.55000000e+00 2.94150000e+01 1.55899500e+02
8.26267350e+02 4.37921695e+03 2.05350000e+01 1.08835500e+02
5.76828150e+02 3.05718920e+03 1.62031027e+04 7.59795000e+01
4.02691350e+02 2.13426415e+03 1.13116000e+04 5.99514801e+04
2.25000000e+00 1.19250000e+01 6.32025000e+01 3.34973250e+02
1.77535822e+03 8.32500000e+00 4.41225000e+01 2.33849250e+02
1.23940102e+03 6.56882543e+03 3.08025000e+01 1.63253250e+02
8.65242225e+02 4.58578379e+03 2.43046541e+04 1.13969250e+02
6.04037025e+02 3.20139623e+03 1.69674000e+04 8.99272202e+04]
[1.00000000e+00 6.60000000e+00 4.35600000e+01 2.87496000e+02
1.89747360e+03 4.40000000e+00 2.90400000e+01 1.91664000e+02
1.26498240e+03 8.34888384e+03 1.93600000e+01 1.27776000e+02
8.43321600e+02 5.56592256e+03 3.67350889e+04 8.51840000e+01
5.62214400e+02 3.71061504e+03 2.44900593e+04 1.61634391e+05
2.30000000e+00 1.51800000e+01 1.00188000e+02 6.61240800e+02
4.36418928e+03 1.01200000e+01 6.67920000e+01 4.40827200e+02
2.90945952e+03 1.92024328e+04 4.45280000e+01 2.93884800e+02
1.93963968e+03 1.28016219e+04 8.44907045e+04 1.95923200e+02
1.29309312e+03 8.53441459e+03 5.63271363e+04 3.71759100e+05
5.29000000e+00 3.49140000e+01 2.30432400e+02 1.52085384e+03
1.00376353e+04 2.32760000e+01 1.53621600e+02 1.01390256e+03
6.69175690e+03 4.41655955e+04 1.02414400e+02 6.75935040e+02
4.46117126e+03 2.94437303e+04 1.94328620e+05 4.50623360e+02
2.97411418e+03 1.96291536e+04 1.29552414e+05 8.55045929e+05]]

정리

NumPy의 polyvander3d() 함수는 x, y, z 세 축의 최대 차수를 개별적으로 지정할 수 있어 3차원 다항식 기저 항목들로 구성된 행렬을 효율적으로 만들 수 있습니다. 위 예제처럼 차수가 [2, 3, 4]로 설정되면 각 샘플 포인트마다 (2+1)×(3+1)×(4+1) = 60개의 열을 가진 행렬이 생성됩니다. 이러한 의사-반데르몬드 행렬은 최소제곱법(least squares)을 이용한 3변수 다항식 피팅 등 다양한 수치 해석 작업의 기반이 됩니다.