2013-02-09 28 views
2

我有一個numpy陣列aa.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'變量的名字。 – 2013-02-10 18:42:08

+0

只是有一個想法:作爲一種選擇,你可以通過使用'aplus = np.amax(np.cumsum(a,axis = 0),axis = 0)'和'aminus = np .amax(np.cumsum(-1 * a,axis = 0),axis = 0)',每個點取較大的數值,然後翻轉來自'aminus'的那些值的符號?但是這變得混亂 - Avaris的解決方案已經足夠乾淨和快速了。 – 2013-02-10 19:00:11