2009-05-24 2 views
6

20 개 이상의 테이블이 테이블 1과 비슷합니다. 모든 문자는 실제 값을 나타냅니다.Python에서 데이터 보간을 쉽게하기위한 데이터 저장소

Table 1: 
$/cars |<1 | 2 | 3 | 4+ 
<10,000 | a | b | c | d 
20,000 | e | f | g | h 
30,000 | i | j | k | l 
40,000+ | m | n | o | p 

사용자 입력은 예를 들어 f, g, j 및 k 사이의 값인 (2.4, 24594) 일 수 있습니다. 파이썬 함수 정의와이 쌍 선형 보간을 계산하기위한 의사 코드는 다음과 같습니다.

def bilinear_interpolation(x_in, y_in, x_high, x_low, y_low, y_high): 
    # interpolate with respect to x 
    # interpolate with respect to y 
    # return result 
나는 테이블 1 (파일, DICT, 튜플, 또는 목록의 DICT의 튜플)의 데이터를 저장해야합니다, 그래서 가장 효율적으로 정확하게 선형 보간을 수행 할 수있는 방법

?

답변

7

제가 생각할 수 있고 표준 라이브러리에만 국한되지 않는 계산 상 효율적인 솔루션을 원하면 scipy/numpy를 사용하는 것이 좋습니다. 먼저 a..p 배열을 2D numpy 배열로 저장 한 다음 $ 4k-10k 및 1-4 배열을 모두 1D numpy 배열로 저장합니다. 1 차원 배열이 단조롭게 증가하는 경우 scipy의 interpolate.interp1d를 사용하고 그렇지 않은 경우 interpolate.bsplrep (bivariate spline representation)을 사용하고 예제 배열은 예제와 같이 작습니다. 아니면 단순히 자신의 글을 쓰고 scipy로 귀찮게하지 마십시오. 다음은 몇 가지 예입니다

# this follows your pseudocode most closely, but it is *not* 
# the most efficient since it creates the interpolation 
# functions on each call to bilinterp 
from scipy import interpolate 
import numpy 
data = numpy.arange(0., 16.).reshape((4,4)) #2D array 
prices = numpy.arange(10000., 50000., 10000.) 
cars = numpy.arange(1., 5.) 
def bilinterp(price,car): 
    return interpolate.interp1d(cars, interpolate.interp1d(prices, a)(price))(car) 
print bilinterp(22000,2) 

에만 단조이 4 × 4 배열처럼 작은 배열에 대한 x와 y)

의 배열을 증가시키는 일을 내가 확인 (2007 틱에서 scipy의 버전) 마지막으로 , 당신이 이것을 사용하기를 원한다고 생각합니다 : http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.bisplrep.html#scipy.interpolate.bisplrep 더 흥미롭게도 모양의 표면을 처리 할 것이고 함수는 한번만 만들어야합니다. 더 큰 배열의 경우, 나는 이것이 (interp1d와 같은 제한이 있는지 확실하지 않다.) http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html#scipy.interpolate.interp2d 을 원한다고 생각하지만 위의 예제에서 3 개의 배열과 다른 더 자세한 데이터 구조가 필요하다.

+0

몇 가지 예를 들려주세요. 비슷한 문제가 있지만 O (log n)에서 깨질 수는 없습니다. –

+0

내 응용 프로그램에서 이미 numpy를 사용하고 있기 때문에 마음에 듭니다. D 감사합니다. – dassouki

0

사용 사례가 특히 이상하게 만드는 쌍 선형 보간에 특별한 것은 없습니다. 전체 행/열의 저장 단위에 대해 두 개의 조회를 수행하거나 배열 유형의 저장에 대해 네 개의 조회 만 수행하면됩니다. 가장 효율적인 방법은 액세스 패턴과 데이터 구조에 따라 다릅니다.

예제가 실제로 대표적인 경우 총 16 개의 항목이 있으면 원하는대로 저장할 수 있으며 모든 종류의 정상로드에 대해 충분히 빠릅니다.

3

정렬 된 첫 번째 열의 목록을 유지하고 표준 라이브러리의 bisect 모듈을 사용하여 값을 찾습니다. 이는 즉시 낮고 즉각적으로 높은 지수를 얻는 가장 좋은 방법입니다. 다른 모든 열은이 열과 나란히 다른 목록으로 유지 될 수 있습니다.