Python 3.x 正在删除最小numpy数组的p%

Python 3.x 正在删除最小numpy数组的p%,python-3.x,numpy,numpy-ndarray,Python 3.x,Numpy,Numpy Ndarray,我使用的是Python 3.7和numpy 1.18。我有一个形状(28,28,3)的多维numpy数组,在这个np数组中,我想去掉20%的最小权重。去掉最小权重的20%意味着我用0来掩盖这些数字 (28,28,3)的20%=470.4=470(四舍五入后) 那么,对于这个np数组,对于470个最小的数字,我如何将它们屏蔽为零呢 谢谢 用于性能。效率,我们可以使用- 示例案例逐步运行- In [91]: np.random.seed(0) In [92]: a = np.random.rand

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

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

那么,对于这个np数组,对于470个最小的数字,我如何将它们屏蔽为零呢


谢谢

用于性能。效率,我们可以使用-

示例案例逐步运行-

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]])
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]])
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]])