2011-12-06 147 views
2

我對python和編程還很新,我試圖弄清楚我是否以正確的方式解決這個問題。我往往有一個matlab辦法的事情,但在這裏我只是掙扎...反向陣列元素評估

語境: 我有兩個numpy的陣列中this image on flickr繪製的,因爲我不能在這裏張貼的照片:(他們是等長的。屬性(都是777x1600),我嘗試使用紅色數組來幫助返回箭頭指示的藍色曲線中的點的索引(圖的x軸上的值)和元素值(y軸) 。藍色陣列的每一行

我一直在負責該過程是: a)決定紅色陣列的最大值(表示與圖紅點和已實現)

和b)從最後一個元素開始到藍色數組的末尾,向後計數,比較元素和前一個元素。目標是確定前一個值下降的位置。 (例如,當元素-1大於元素-2時,表示圖像中的最後一個峯值)。此外,爲了防止在值增大的部分尾部選擇「噪聲」,我還需要將選定值限制爲大於紅色數組的最大值。

這是我到目前爲止,但我卡在第二行,我必須評估從該行中的(-1)位置的數組的選定行到開始,或(0)位置:

for i,n in enumerate(blue): #select each row of blue in turn to analyze 
    for j,m in enumerate(n): #select each element of blue ??how do I start from the end of array and work backwards?? 
     if m > m-1 and m > max_val_red[i]: 
     indx_m[i] = j 
     val_m[i] = m 
+0

enumerate(n [:: - 1])可以工作... 該列表將被逆轉,但索引將從0開始到n – avasal

回答

0

對不起,我沒有閱讀全部內容,但可以查看內置函數的反轉。 因此而不是枚舉(n)。你可以做倒轉(枚舉(n))。但是,那麼你的索引將是錯誤的正確的索引將評估len(n) - j

2

要直接回答您的問題,您可以使用n [:: - 1]來反轉arrray n。

因此,代碼爲:

for j, m in enumerate(n[::-1]): 
    j = len(n)-j-1 
    # here is your code 

但增加計算速度,你應該避免蟒蛇循環:

import numpy as np 
n = np.array([1,2,3,4,2,5,7,8,3,2,3,3,0,1,1,2]) 

idx = np.nonzero(np.diff(n) < 0)[0] 
peaks = n[idx] 
mask = peaks > 3 # peak muse larger than 3 

print "index=", idx[mask] 
print "value=", peaks[mask] 

輸出爲:

index= [3 7] 
value= [4 8] 
+0

謝謝您的建議,並且我會在截止日期不再來時提醒您。非常感激。 –

1

我假定你的意思:

if m > n[j-1] and m > max_val_red[i]: 
    indx_m[i] = j 
    val_m[i] = m 

因爲m > m - 1總是真

要反轉的軸線上你可以索引該軸上使用::-1陣列,例如以反向於軸線1藍色可以使用一個陣列:

blue_reverse = blue[:, ::-1] 

試着看看你可以將你的函數寫成一組數組操作而不是循環(這往往會更快)。這與其他答案類似,但它應該允許您避免當前正在使用的兩個循環:

threshold = red.max(1) 
threshold = threshold[:, np.newaxis] #this makes threshold's shape (n, 1) 

blue = blue[:, ::-1] 
index_from_end = np.argmax((blue[:, :-1] > blue[:, 1:]) & (blue[:, :-1] > threshold), 1) 
value = blue[range(len(blue)), index_from_end] 
index = blue.shape[1] - 1 - index_from_end