【问题标题】:Filter by index and flattened in numpy, like tf.sequence_mask按索引过滤并在 numpy 中展平,如 tf.sequence_mask
【发布时间】:2019-06-09 11:45:56
【问题描述】:

我想用一个索引过滤我的二维数组,然后只用过滤器中的值平展这个数组。这几乎是 tf.sequence_mask 会做的,但我需要在 numpy 或其他灯光库中使用它。

谢谢!

PD: 这是一个例子:

array_2d = [[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]] # this is a numpy array
array_len = [6,5,3]
expected_output = [0,1,2,3,4,5,8,9,10,11,12,21,22,21]

【问题讨论】:

    标签: python numpy tensorflow masking


    【解决方案1】:

    这是一个vectorized 解决方案,使用布尔掩码来索引array_2d

    array_2d = np.array([[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]]) 
    array_len = [6,5,3]
    
    m = ~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
    array_2d[m]
    array([ 0,  1,  2,  3,  4,  5,  8,  9, 10, 11, 12, 21, 22, 21])
    

    详情

    在与array_2d 形状相同的ones 的ndarray 上使用cumsum 创建掩码,并执行逐行比较以查看哪些元素大于array_len

    所以第一步是创建以下ndarray

    np.ones(array_2d.shape).cumsum(axis=1)
    
    array([[1., 2., 3., 4., 5., 6.],
           [1., 2., 3., 4., 5., 6.],
           [1., 2., 3., 4., 5., 6.]])
    

    并与array_len 进行逐行比较:

    ~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
    
    array([[ True,  True,  True,  True,  True,  True],
           [ True,  True,  True,  True,  True, False],
           [ True,  True,  True, False, False, False]])
    

    然后你只需要过滤数组:

    array_2d[m]
    array([ 0,  1,  2,  3,  4,  5,  8,  9, 10, 11, 12, 21, 22, 21])
    

    【讨论】:

      【解决方案2】:

      这是使用布尔掩码并将其应用于扁平化array_2d的一种方法

      array_2d = np.array([[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]]) 
      array_len = [6,5,3]
      
      # Create a boolean mask
      mask = np.zeros((array_2d.shape), dtype=bool)
      
      # Change to True for elements to be kept
      for i, j in enumerate(array_len):
              mask[i][0:j] = True
      
      expected_output = array_2d.flatten()[mask.flatten()]
      

      输出

      array([ 0,  1,  2,  3,  4,  5,  8,  9, 10, 11, 12, 21, 22, 21])
      

      【讨论】:

        猜你喜欢
        • 2021-09-14
        • 1970-01-01
        • 2012-04-11
        • 2021-11-17
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        相关资源
        最近更新 更多