【问题标题】:Removing p% of smallest numpy array删除最小 numpy 数组的 p%
【发布时间】:2020-02-28 13:14:09
【问题描述】:

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

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

那么,对于这个 np 数组,对于 470 个最小的数字,我怎样才能将它们屏蔽为零?

谢谢!

【问题讨论】:

    标签: python-3.x numpy numpy-ndarray


    【解决方案1】:

    为了性能。效率,我们可以使用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]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多