2016-04-06 70 views
0

我有一個數組200x200,其值爲-600至100.我想保持95%的正值不變並設置5%的最大正值達到95%。負面是一樣的。使用numpy將一個數組中的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 
相關問題