2014-02-20 22 views
2
import numpy as np 
    def get_positions(values, mintreshold=0.1): 
     maxindex = 0 
     result_row = np.zeros(np.shape((0, 0)), dtype=int) 
     result = np.matrix(result_row) 
     result_index = 0 
     for index in xrange(len(values)): 
      diff = values[maxindex] - values[index] 
      if diff < 0: 
       maxindex = index 
      elif diff >= mintreshold: 
       result[result_index, 1] = index 
       result = np.vstack((result, result_row)) 
       result_index += 1 
     return result 

我有一個函數,就像你看到的,給我給定列表的位置。簡單地過濾它。 所以我知道numpy.matrix不應該這樣調用,這不能成爲創建numpy.matrix的正確方法。但對於那些條件控制變量,如minindexmaxindex,我不能使用map,lambdafilter用python中的條件控制變量過濾數組以創建numpy矩陣

通過填充控制變量以功能方式創建numpy.matrix的正確方法是什麼?

編輯: 只要我想用類似positions = map(get_positions, values)

+1

我敢打賭,有一種簡單的方法可以用'np.where'和'np.argmax' /'values.max()'完成你想要的任務。可能類似'np.where(values-values.max()> = max_threshold)'。 – wflynny

+1

你能展示一個示例輸入並期望輸出嗎? – wflynny

+0

我刪除了minindex值來清除。 用這種方法我想得到最高點差異矩陣到最新的最低點。例如。 'print get_positions([1,2,1,2,3,1])'prints' [[0 2] [0 5] [0 0]]' – Alkimake

回答

2

我不知道如果這正是你在找什麼,但reducefunctools這裏可以用來積累依賴於一個國家的「過去「的輸入列表值。一旦計算出與每個輸入對應的狀態列表,您可以使用filter來刪除不想要的條目,最後使用map來提取您之後的信息。請注意0​​用於將索引注入列表。

from functools import reduce 

def calc_diff(state, val): 
    max=state[-1]['max'] 
    diff=max-val 
    if (diff<0): max=val 
    state.append({'max': max, 'diff': diff}) 
    return state 

in_list=[1,2,1,2,3,1] 

states=reduce(calc_diff, in_list, [{'max': 0}])[1:] 

result=list(map(lambda s: [0, s[0]], filter(lambda s: s[1]['diff']>0.1, enumerate(states)))) 
當您運行此

states將舉行

[{'diff': -1, 'max': 1}, 
{'diff': -1, 'max': 2}, 
{'diff': 1, 'max': 2}, 
{'diff': 0, 'max': 2}, 
{'diff': -1, 'max': 3}, 
{'diff': 2, 'max': 3}] 

而結果將是[[0, 2], [0, 5]]。如果您願意,您可以在註釋中附加[0, 0]以匹配您想要的輸出。

還要特別注意reduce調用結束時的[1:],它刪除了我注入的初始狀態。

最後,您可以在calc_diff中添加閾值的過濾條件,並在稍後避免過濾步驟,但我覺得這種方法更靈活一些。

+0

我還發現你可以將狀態從'[(max1,diff1),...]'改變爲'(lastMax,[diff1,diff2,...])'並避免保留最大值的歷史記錄爲整個列表。 – vhallac