代码之家  ›  专栏  ›  技术社区  ›  AnthonyML

修改2d numpy数组中分隔符后的行中的所有元素

  •  1
  • AnthonyML  · 技术社区  · 1 年前

    如果我有一个2d numpy(整数,d也是整数)数组,比如

    [[0 1 2 d]
     [3 4 d 5]
     [6 d 7 8]]
    

    如何将每行d(包括d)之后的所有元素(按行)清零?

    我使用了for循环,但我想知道是否有通过numpy的矢量化方法。我刚刚看到,也许你可以减去一个三角矩阵:

    [[0 0 0 d]
     [0 0 d 5]
     [0 d 7 8]]
    

    但这并不能解决我的问题,因为它需要将d之前的值清零。

    编辑:

    repr(数组)

    array([[0, 1, 2, d],
       [3, 4, d, 5],
       [6, d, 7, 8]], dtype=int64)
    
    1 回复  |  直到 1 年前
        1
  •  3
  •   mozway    1 年前

    IIUC,你可以用 cumsum 并用它来掩盖领先的价值观 where :

    d = 9
    a = np.array([[0, 1, 2, d],
                  [3, 4, d, 5],
                  [6, d, 7, 8]])
    
    out = np.where(np.cumsum(a == d, axis=1), a, 0)
    

    具有的变体 cumprod 以及就地修改:

    a[np.cumprod(a!=d, axis=1).astype(bool)] = 0
    

    输出:

    array([[0, 0, 0, 9],
           [0, 0, 9, 5],
           [0, 9, 7, 8]])
    

    中间掩码(对于第一种方法,考虑非零值 True ):

    # np.cumsum(a == d, axis=1)
    array([[0, 0, 0, 1],
           [0, 0, 1, 1],
           [0, 1, 1, 1]])
    
    # np.cumprod(a!=d, axis=1).astype(bool)
    array([[ True,  True,  True, False],
           [ True,  True, False, False],
           [ True, False, False, False]])