2013-02-09 1 views
2

나는 numpy 배열 a, a.shape=(17,90,144)을 가지고 있습니다. cumsum(a, axis=0)의 각 열의 최대 크기를 찾고 싶지만 원래 기호는 그대로 유지하고 싶습니다. 즉, 주어진 열 a[:,j,i]에 대해 가장 큰 크기 인 cumsum이 음수 값에 해당하면 마이너스 기호를 유지하려고합니다.Numpy는 축을 따라 cumsum의 최대 크기를 부호로 붙였습니다.

코드 np.amax(np.abs(a.cumsum(axis=0)))은 나에게 크기를 가져 오지만 표시를 유지하지 않습니다. 대신 np.argmax을 사용하면 필자가 원하는 인덱스를 얻을 수 있으며 원래의 cumsum 어레이에 연결할 수 있습니다. 그러나 그렇게 할 수있는 좋은 방법을 찾을 수는 없습니다.

다음 코드는 작동하지만 정말 천천히 더러운이며 :

max_mag_signed = np.zeros((90,144)) 
indices = np.argmax(np.abs(a.cumsum(axis=0)), axis=0) 
for j in range(90): 
    for i in range(144): 
     max_mag_signed[j,i] = a.cumsum(axis=0)[indices[j,i],j,i] 

깨끗하고,이 작업을 수행하는 빠른 방법이 있어야합니다. 어떤 아이디어?

답변

4

나는 argmax에 대한 대안을 찾을 수 있지만, 적어도 당신은 더 벡터화 된 접근 방식이 고정 할 수 있습니다

# store the cumsum, since it's used multiple times 
cum_a = a.cumsum(axis=0) 

# find the indices as before 
indices = np.argmax(abs(cum_a), axis=0) 

# construct the indices for the second and third dimensions 
y, z = np.indices(indices.shape) 

# get the values with np indexing 
max_mag_signed = cum_a[indices, y, z] 
+0

감사합니다 - 엄청난 속도 향상을. 나는'np.indices' 함수에 익숙하지 않았습니다. 코드 가독성을 위해서 필자는'indices' 변수의 이름을 변경해야한다고 생각합니다. –

+0

방금 ​​생각 했었습니다 : 대안으로'aplus = np.amax (np.cumsum (a, axis = 0), axis = 0)'과'aminus = np '를 취함으로써 (의사 코드로) .amax (np.cumsum (-1 * a, axis = 0), axis = 0)', 각 점에서 더 큰 크기를 취한 다음 'aminus'에서 나온 값의 부호를 바꿉니 까? 그러나 이것은 지저분 해지고 있습니다. Avaris의 솔루션은 이미 충분히 깨끗하고 빠릅니다. –

관련 문제