正在删除最小numpy数组的p%



我使用的是Python 3.7和numpy 1.18。我有一个形状为(28,28,3(的多维numpy数组,在这个np数组中,我想删除最小权重的20%。去掉最小权重的20%意味着我用0来掩盖这些数字。

(28,28,3(的20%=470.4=470(四舍五入后(。

那么,对于这个np数组,对于470个最小的数字,我如何将它们掩码为零?

谢谢!

为了提高性能,我们可以使用np.argpartition-

# a is input ndarray
N = int(np.round(a.size*0.2))
a.flat[np.argpartition(a.flat,kth=N)[:N]] = 0

示例案例逐步运行-

In [91]: np.random.seed(0)
In [92]: a = np.random.randint(10,100,(4,5))
In [93]: a
Out[93]: 
array([[54, 57, 74, 77, 77],
[19, 93, 31, 46, 97],
[80, 98, 98, 22, 68],
[75, 49, 97, 56, 98]])
In [94]: n = 0.2 # ratio of total to be reset
In [95]: N = int(np.round(a.size*n)) # 4
In [96]: a.flat[np.argpartition(a.flat,kth=N)[:N]] = 0
# change 0 to new value to be set, if not zero
In [97]: a
Out[97]: 
array([[54, 57, 74, 77, 77],
[ 0, 93,  0,  0, 97],
[80, 98, 98,  0, 68],
[75, 49, 97, 56, 98]])

或者,我们可以得到阈值,然后进行比较并分配到掩蔽的一个中

In [117]: threshold_val = a.flat[np.argpartition(a.flat,kth=N)[N]]
In [118]: a[a<threshold_val] = 0
In [119]: a
Out[119]: 
array([[54, 57, 74, 77, 77],
[ 0, 93,  0,  0, 97],
[80, 98, 98,  0, 68],
[75, 49, 97, 56, 98]])

或者使用np.percentile-

In [148]: a[a<np.percentile(a,20)] = 0
In [149]: a
Out[149]: 
array([[54, 57, 74, 77, 77],
[ 0, 93,  0,  0, 97],
[80, 98, 98,  0, 68],
[75, 49, 97, 56, 98]])