2016-04-06 19 views
0

配列は200x200です。値は-600から100までです。正の値をそのまま95%に保ち、5% 95%に値する。否定は同じです。numpyを使用して1つの配列内のある値に5%の最大値を変更します

これは私のコードであり、とても醜いので改善したいと思っています。

idx_pos = np.where(x > 0.) 
idx_pos_sorted = np.argsort(x[idx_pos]) 
n = len(idx_pos[0]) 
n_punc = int(n*percentage) 
x[idx_pos[0][idx_pos_sorted[n_punc:]], idx_pos[1][idx_pos_sorted[n_punc:]]] = (
    x[idx_pos[0][idx_pos_sorted[n_punc]], idx_pos[1][idx_pos_sorted[n_punc]]]) 

以下のヒストグラムは、配列の値です。

enter image description here

答えて

3

をnumpy.percentile (numpy docs)を使用できます。

def cutter(data, percent): 
    pc = np.percentile(data[data>0], percent) 
    data[data>pc] = pc 

cutter(x, 95) 
x *= -1 
cutter(x, 95) 
x* = -1 
0

まず、すべての正の値の95パーセンタイルを計算する:

flat_x = np.sort(np.ravel(x[x > 0])) 
pctl_idx = int(0.95 * len(flat_x)) 
pctl = flax_x[pctl_idx] 

次に、この値には、このより大きいすべての要素を設定:短いそれを書くために

x[x > pctl] = pctl 
関連する問題