【问题标题】:Set last non-zero element of each row to zero - NumPy将每行的最后一个非零元素设置为零 - NumPy
【发布时间】:2016-10-10 13:27:06
【问题描述】:

我有一个数组 A:

A = array([[1, 2, 3,4], [5,6,7,0] , [8,9,0,0]])

我想把每行最后一个非零值改为0

A = array([[1, 2, 3,0], [5,6,0,0] , [8,0,0,0]])

如何为任何 n*m numpy 数组编写代码? 谢谢,S ;-)

【问题讨论】:

    标签: python numpy theano


    【解决方案1】:

    方法#1

    一种基于cumsumargmax 的方法-

    A[np.arange(A.shape[0]),(A!=0).cumsum(1).argmax(1)] = 0
    

    示例运行 -

    In [59]: A
    Out[59]: 
    array([[2, 0, 3, 4],
           [5, 6, 7, 0],
           [8, 9, 0, 0]])
    
    In [60]: A[np.arange(A.shape[0]),(A!=0).cumsum(1).argmax(1)] = 0
    
    In [61]: A
    Out[61]: 
    array([[2, 0, 3, 0],
           [5, 6, 0, 0],
           [8, 0, 0, 0]])
    

    方法 #2

    基于argmax 的另一个,希望更高效 -

    A[np.arange(A.shape[0]),A.shape[1] - 1 - (A[:,::-1]!=0).argmax(1)] = 0
    

    说明

    argmax 的一个用途是获取max 元素在数组中沿轴的第一次 出现的ID。在第一种方法中,我们沿行获取 cumsum 并获取第一个最大 ID,它表示最后一个非零元素。这是因为剩余元素上的cumsum 不会增加最后一个非零元素之后的总和值。

    让我们以更详细的方式重新运行该案例 -

    In [105]: A
    Out[105]: 
    array([[2, 0, 3, 4],
           [5, 6, 7, 0],
           [8, 9, 0, 0]])
    
    In [106]: (A!=0)
    Out[106]: 
    array([[ True, False,  True,  True],
           [ True,  True,  True, False],
           [ True,  True, False, False]], dtype=bool)
    
    In [107]: (A!=0).cumsum(1)
    Out[107]: 
    array([[1, 1, 2, 3],
           [1, 2, 3, 3],
           [1, 2, 2, 2]])
    
    In [108]: (A!=0).cumsum(1).argmax(1)
    Out[108]: array([3, 2, 1])
    

    最后,我们使用fancy-indexing 将它们用作列索引以在A 中设置适当的元素。

    在第二种方法中,当我们在布尔数组上使用argmax 时,我们只是得到了True 的第一次出现,我们在输入数组的行翻转版本中使用了它。因此,我们将拥有原始顺序中的最后一个非零元素。其余的想法都是一样的。

    【讨论】:

    • 你能解释一下argmax的使用吗??
    • @DOKnow 在帖子中添加了一些 cmets。
    【解决方案2】:

    一种方法是使用所需的行和列索引显式形成数组:

    A = np.array([[1, 2, 3,4], [5,6,7,0] , [8,9,0,0]])
    row_inds = np.arange(A.shape[0])
    col_inds = np.arange(A.shape[1])
    nonzero_col_inds = (A > 0) * col_inds
    max_nonzero_col_inds = np.max(nonzero_col_inds, 1)
    A[row_inds, max_nonzero_col_inds] = 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-27
      • 2023-04-09
      • 2019-09-02
      • 2021-12-27
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多