2013-03-01 3 views
1

큰 2 차원 배열의 'x'값을 계산할 때 너무 많은 시간이 걸리는 1 차원 함수가 있으므로 SciPy를 사용하여 보간 함수를 만드는 것이 훨씬 쉽습니다. 그런 다음이를 사용하여 y를 계산하면 훨씬 빠릅니다. 그러나 1-D가 넘는 배열에서는 보간 함수를 사용할 수 없습니다.2 차원 배열을 통한 보간 함수 사용

예 :

# First, I create the interpolation function in the domain I want to work 
x = np.arange(1, 100, 0.1) 
f = exp(x) # a complicated function 
f_int = sp.interpolate.InterpolatedUnivariateSpline(x, f, k=2) 

# Now, in the code I do that 
x = [[13, ..., 1], [99, ..., 45], [33, ..., 98] ..., [15, ..., 65]] 
y = f_int(x) 
# Which I want that it returns y = [[f_int(13), ..., f_int(1)], ..., [f_int(15), ..., f_int(65)]] 

그러나 반환 :

ValueError: object too deep for desired array 

는 내가 모든 X 회원 돌이 할 수 알지만, 그것은 더 나은 옵션 인 경우 몰라요 ...

감사합니다.

편집 :

답변

2

f_int 단일 차원 데이터를 원하는 경우,

>>> x = np.arange(1, 100, 0.1) 
>>> f = 2 * x # a simple function to see the results are good 
>>> f_int = scipy.interpolate.InterpolatedUnivariateSpline(x, f, k=2) 

>>> x = np.arange(25).reshape(5, 5) + 1 
>>> x 
array([[ 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20], 
     [21, 22, 23, 24, 25]]) 
>>> x_int = f_int(x.reshape(-1)).reshape(x.shape) 
>>> x_int 
array([[ 2., 4., 6., 8., 10.], 
     [ 12., 14., 16., 18., 20.], 
     [ 22., 24., 26., 28., 30.], 
     [ 32., 34., 36., 38., 40.], 
     [ 42., 44., 46., 48., 50.]]) 

x.reshape(-1)는 않습니다 : 당신은 당신의 원래 모양을 복원, 보간에 공급, 귀하의 의견을 평평하게한다 평평하게하고 .reshape(x.shape)은 원래 형식으로 되돌립니다.

+0

가장자리 주위에 이상하게 보일 수 있습니다. – reptilicus

+0

@reptilicus 왜? 당신이 무엇을 의미하는지 이해하지 못하는 것 같아요. 미안합니다 ... – Jaime

+0

보간법은 원래의 배열의 가장자리에있는 값을 다른 것으로 바꾸고, 배열을 평평하게 한 다음 보간 한 후 다시 모양을 바꾼다 고 생각했습니다. 기본적으로 원래 배열의 왼쪽 가장자리는 문제를 일으킬 수도 있고 그렇지 않을 수도있는 다음 행의 오른쪽 가장자리로 보간됩니다. – reptilicus

0

내가 사용하는 것이 ... 나는 np.vectorize을 시도했지만 너무 느리다

def vector_op(function, values): 

    orig_shape = values.shape 
    values = np.reshape(values, values.size) 

    return np.reshape(function(values), orig_shape) 

:

그런 함수는 일을 할 것입니다 list comprehensionmap의 조합

In [24]: x 
Out[24]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 

In [25]: [map(lambda a: a*0.1, x_val) for x_val in x] 
Out[25]: 
[[0.1, 0.2, 0.30000000000000004], 
[0.1, 0.2, 0.30000000000000004], 
[0.1, 0.2, 0.30000000000000004]] 
(내가 부족이 중첩 maps를 사용하는 방법이있을 수 있습니다)

이 함수와 lambda a: a*0.1을 대체 .... 단지 설명을 위해입니다 f_int

1

난 당신이 NumPy와의 벡터화 기능을 수행 할 생각 :

#create some random test data 
test = numpy.random.random((100,100)) 

#a normal python function that you want to apply 
def myFunc(i): 
    return np.exp(i) 

#now vectorize the function so that it will work on numpy arrays 
myVecFunc = np.vectorize(myFunc) 

result = myVecFunc(test)