2017-11-05 2 views
1

필자는 열 또는 첫 번째 차원에 피크가있는 3D 데이터의 "큐브"를 가지고 있습니다. 피크의 인덱스는 검사되는 행에 따라 이동할 수 있습니다. 세 번째 차원은 좀 더 복잡한 것을 할 수도 있지만, 지금은 선형 함수로 스케일링하는 것으로 생각할 수 있습니다.dim3에서 다양한 인덱스를 사용하여 dim1을 따라 자릅니다.

각 행에 대해 열 피크가 0.5에 가장 근접하도록 Z 인덱스가 선택된다는 제약 조건에 따라 첫 번째 차원을 따라 max의 인덱스를 찾고 싶습니다. 여기

는 고정 Z와 행에 비행기, 열입니다 샘플 이미지입니다 :

sample image of a row,column plane of the data with fixed z

이 배열은 항상 큰 것 - 말 21x11x200 float64s, 그래서 나는 벡터화 싶습니다 이 계산. for 루프를 작성, 그것은 다음과 같습니다

cols, rows, zs = data.shape 
for i in range(rows): 
    # for each field point, make an intermediate array that is 2D with focus,frequency dimensions 
    arr = data[:,i,:] 

    # compute the thru-focus max and find the peak closest to 0.5 
    maxs = np.max(arr, axis=0) 
    max_manip = np.abs(maxs-0.5) 
    freq_idx = np.argmin(max_manip) 

    # take the thru-focus slice that peaks closest to 0.5 
    arr2 = data[:,i,freq_idx] 
    focus_idx = np.argmax(arr2) 
    print(focus_idx) 

내 문제는 내가 벡터 연산들로 이러한 계산을 롤백하는 방법을 모른다는 것이다. 나는 어떤 도움을 주셔서 감사합니다, 감사합니다!

답변

1

우리는 단지 거기에 관련 ufuncs으로 axis PARAM를 사용해야하고이 같은, 벡터화 솔루션으로 우리를 이끌 것 -이 나에게`for` 루프 버전에 다른 대답을 제공

# Get freq indices along all rows in one go 
idx = np.abs(data.max(0)-0.5).argmin(1) 

# Index into data with those and get the argmax indices 
out = data[:,np.arange(data.shape[1]), idx].argmax(0) 
+0

- - loop는'[10 10 9 9 9 9 8 8 8 7]'을주고 vectorized는'[9 9 9 9 9 9 8 8 7 7]'을 준다. –

+0

@BrandonDube 거기에'abs'를 사용하여 놓친 것. 편집 됨. – Divakar

+0

나는 그것을 더했다. - 조금 더 살펴 보도록하겠습니다. –

관련 문제