2012-06-07 3 views
2

저는 하이퍼 스펙트 럴 이미징과 비슷한 이미지의 각 픽셀에 대한 데이터를 포함하는이 데이터 큐브를 가지고 있습니다. 효율적인 방법으로 이미지의 각 픽셀에 선을 맞추려고합니다. 지금은 이렇게하고 있습니다 :중첩 루프 연산 최적화

내 데이터 큐브는 6X1024x1024입니다. 내 데이터의 독립 변수를 포함하는 다른 변수가 있습니다.

map = np.zeros((1024,1024)) 
for i in np.mgrid[1:1024]: 
    for j in np.mgrid[1:1024]: 
     x = independent_variable # This is my independent variable 
     y = spec_cube[:,i,j] # The Y data to be fitted is the power at each scale, for a pixel 
     index = polyfit(x,y,1) # Outputs the slope and the offset 
     map[i,j] = index[0] # The pixel value is the index 

나는 루프에 대한 중첩 된 거의 일반적으로 할 수있는 최악의 일이 있다는 것을 알고,하지만 난 더 나은 방법을 생각할 수 없다. "에 ValueError : 너무 많은 값을 풀고"일을 속도를

map = np.zeros((1024,1024)) 
for i,j in map: 
    x = independent_variable # This is my independent variable 
    y = spec_cube[:,i,j] # The Y data to be fitted is the power at each scale, for a pixel 
    index = polyfit(x,y,1) # Outputs the slope and the offset 
    map[i,j] = index[0] # The pixel value is the index 
+0

이 질문과 관련 질문은 파이썬/numpy의 일반적인 문제점을 보여줍니다. 내부 루프가 꽉 찼기 때문에 numpy 벡터 연산이 없으면 최적화하는 데 아무리 어려움이 있더라도 본질적으로 문제가됩니다. 이러한 유형의 사례에서는 C- 확장 또는 더 나은 아직 Cython과 같은 다른 대안을 진지하게 고려해야합니다. –

답변

3

루프 내에서의 연산은 기울기 라인의, 나는 덜 정확한 방법으로 갔다지만, 배열 작업을 사용합니다. 기본적으로 기울기를 찾으려면 각 인접 점에 대해 델타 Y/델타 X를 계산 한 다음 모든 기울기를 평균했습니다.

몇 분 정도 걸립니다. 내 스크립트가 9.66s로 420 초로에서 갔다

map = np.zeros((spec_cube.shape[1],spec_cube.shape[2])) # This will be the power index map 
x = scale_array 
for i in np.mgrid[1:spec_cupe.shape[0]]: 
    spec_cube[i-1] = (spec_cube[i]-spec_cube[i-1])/(scale_array[i]-scale_array[i-1]) 
    map += spec_cube[i-1] 
map /= (spec_cube.shape[0]-1) 

:

여기에 새로운 코드입니다!

+0

수정 프로그램에 대한 축하! 가능한 경우 다른 사람들이 귀하의 성공을 통해 배울 수 있도록 귀하의 답변을 '수락'으로 표시하십시오. 건배 ~ –

4

한 가지 방법을 :

for (i, j) in itertools.product(np.mgrid[1:1024], np.mgrid[1:1024]): 
    ... stuff ... 

개선 (: itertools.product를 사용

나는 다음과 같은 있지만,이 오류를 제공 노력 Python 2.7.1) :

 
In [2]: def multiline(): 
    ...:  for i in np.mgrid[1:1024]: 
    ...:   for j in np.mgrid[1:1024]: 
    ...:    pass 
    ...:   

In [3]: def single_line(): 
    ...:  for i, j in product(np.mgrid[1:1024], np.mgrid[1:1024]): 
    ...:   pass 
    ...:  

In [4]: from itertools import product 

In [5]: %timeit multiline() 
10 loops, best of 3: 138 ms per loop 

In [6]: %timeit single_line() 
10 loops, best of 3: 75.6 ms per loop 
+0

감사합니다. 코드를 단순화하고 속도를 약간 향상 시켰습니다. 제 목적을 달성하기에 충분하지 않습니다. 매 3 초마다 실행하려는 작업에는 412 초가 걸립니다 ... 이 계산을 피할 방법을 찾아야합니다. – PhilMacKay