Python 使用numpy将一个数组中的5%最大值更改为某个值

Python 使用numpy将一个数组中的5%最大值更改为某个值,python,numpy,Python,Numpy,我有一个数组200x200,它的值从-600到100。我希望保持95%的正值不变,并将5%最大正值设置为95%。消极的是相同的 这是我的代码,太难看了,我希望能改进 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][

我有一个数组200x200,它的值从-600到100。我希望保持95%的正值不变,并将5%最大正值设置为95%。消极的是相同的

这是我的代码,太难看了,我希望能改进

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]]])
下面的直方图是数组的值


首先,计算所有正值的第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

首先,计算所有正值的第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

要写得更短,可以使用numpy.percentile.:


要写得更短,可以使用numpy.percentile.: