6.16. 곡선과 적분¶
수학 페이지들은 배열을 입력받아 배열(또는 스칼라)을 출력하는 연산들 – 산술, 리덕션, 브로드캐스팅 – 을 다루었습니다. 이 페이지는 다른 부류의 연산을 다룹니다: 배열을 샘플링된 함수 로 취급하고 그 함수 자체에 대해 질문하는 연산들입니다. 샘플 사이를 보간하기, 샘플에 곡선을 피팅하기, 그 아래를 적분하기, 다른 버퍼와 컨볼루션하기 등이 있습니다.
이들은 모두 ndarray 입력을 받아들이고 float 스칼라 또는 float ndarray 를 반환합니다.
6.16.1. 보간¶
interp() 는 1차원 선형 보간을 수행합니다. xp 는 단조 증가하는 1차원 독립 값 배열이고, fp 는 그에 대응하는 종속 값이며, x 는 보간값을 평가할 위치입니다:
xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x = np.array([0.5, 1.5, 2.5])
np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])
[xp[0], xp[-1]] 범위 밖에서는 결과가 각각 fp[0] 과 fp[-1] 로 클리핑됩니다. left= 및 right= 키워드로 이 끝점 값을 재정의할 수 있습니다.
카메라에서는 보정 테이블을 임의의 샘플 위치로 다시 매핑하는 데 사용됩니다 – 서미스터의 온도-전압 테이블, 비선형 픽셀 응답 곡선, 채널별 감마 룩업 등이 있습니다. 단 한 번의 라이브러리 호출, 입력에 대한 한 번의 처리이며 Python 루프가 없습니다.
6.16.2. 다항식 피팅과 평가¶
polyfit() 은 최소제곱법으로 데이터 점 (x, y) 에 차수 deg 의 다항식을 피팅하고 계수(최고 차수가 먼저)를 반환합니다:
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])
coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0]) (approximately)
x 가 생략되면 range(len(y)) 가 사용됩니다 – 연결된 x축이 없는 규칙적으로 샘플링된 버퍼에 빠르게 다항식을 피팅하는 데 유용합니다:
np.polyfit(y, 2)
polyval() 은 계수가 p 인 다항식을 x 에서 평가합니다. 입력 x 는 스칼라(float를 반환)일 수도 있고 ndarray(ndarray 를 반환)일 수도 있습니다:
p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)
자연스러운 조합은 보정 시점에 polyfit 을 한 번 호출하여 계수를 저장하고, 매 프레임마다 polyval 을 호출하여 결과 곡선을 평가하는 것입니다. 다항식 평가 단계는 샘플당 몇 번의 float 연산에 불과하므로, 가장 작은 카메라에서도 비용이 저렴합니다.
6.16.3. 컨볼루션¶
convolve() 는 두 1차원 배열의 전체 길이 이산 선형 컨볼루션을 반환합니다. full 모드만 구현되어 있으며, 출력 길이는 len(a) + len(v) - 1 입니다. 데스크톱 numpy 가 제공하는 same 및 valid 모드와 동일한 효과를 얻으려면 결과를 슬라이스하십시오:
a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])
np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])
SOS 체인을 설정하는 것이 과한 짧은 FIR 필터와 평활화 커널(박스, 삼각, 가우시안)에 유용합니다. 실행 시간은 두 배열 길이의 곱에 비례하는데, 짧은 커널에는 적합하지만 긴 커널에서는 FFT 컨볼루션보다 빠르게 더 비싸집니다.
6.16.4. 사다리꼴 적분¶
trapz() 는 복합 사다리꼴 규칙으로 샘플링된 함수를 적분합니다:
x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x) # ~ 2.0
샘플 간격이 균일하고 스텝만 중요할 때는 dx= 를 전달하고, 샘플이 균등하게 간격을 두고 있지 않을 때는 x= 를 전달하십시오. 해석적 형태를 사용할 수 없는, 이미 캡처된 센서 데이터를 적분하기에 적합한 호출입니다.
대역 제한 된 샘플 데이터(예: 안티앨리어싱 필터를 거친 오디오 버퍼)의 경우, 사다리꼴 규칙은 샘플 개수의 제곱에 따라 수렴합니다. 이는 버퍼 길이를 두 배로 늘리면 오차가 4분의 1로 줄어든다는 것을 의미합니다.
피적분 함수가 샘플 버퍼가 아니라 애플리케이션이 임의의 점에서 평가할 수 있는 Python 함수인 경우에는 다른 계열의 솔버가 적합한 선택입니다.