【问题标题】:In python how to delete a series of columns every nth element in a numpy 3d array?在python中如何删除numpy 3d数组中每个第n个元素的一系列列?
【发布时间】:2020-02-16 13:42:56
【问题描述】:

类似于question,假设我有一个 3D Numpy 数组,为了清楚起见,我在上面添加了一个注释标签:

          #C  C  C  R  R  C  C  C  R  R  C  C  C
    a = [[[10,11,12,13,14,15,16,17,18,19,20,21,22],
          [23,24,25,26,27,28,29,30,31,32,33,34,35]],                

         [[36,37,38,39,40,41,42,43,44,45,46,47,48],
          [48,49,50,51,52,53,54,55,56,57,58,59,60]],

         [[61,62,63,64,65,66,67,68,69,70,71,72,73],
          [74,75,76,77,78,79,80,81,82,83,84,85,86]]]

我可以在一行代码中删除标记为R 的列吗?因此,从索引 3 开始,每隔五个元素删除两列。在这种情况下,生成的数组将如下所示:

          #C  C  C  C  C  C  C  C  C
    a = [[[10,11,12,15,16,17,20,21,22],
          [23,24,25,28,29,30,33,34,35]],                

          [[36,37,38,41,42,43,46,47,48],
           [48,49,50,53,54,55,58,59,60]],

          [[61,62,63,66,67,68,71,72,73],
           [74,75,76,79,80,81,84,85,86]]]

我想让代码更通用,以便它可以处理删除不同大小和位置的 3D 数组中的列对。对于此示例,我可以使用以下命令一次删除一列:

    start = 3
    step = 5
    a = numpy.delete(big, numpy.s_[start:numpy.size(big, 2):step], 2)
    a = numpy.delete(a, numpy.s_[start:numpy.size(a, 2):step - 1], 2)

但是有没有办法指定要删除的列范围,从而在一行代码中完成任务?

【问题讨论】:

    标签: python arrays numpy multidimensional-array


    【解决方案1】:

    非常类似于linked posted answer there -

    In [4]: a[...,np.mod(np.arange(a.shape[-1]),5)<3]
    Out[4]: 
    array([[[10, 11, 12, 15, 16, 17, 20, 21, 22],
            [23, 24, 25, 28, 29, 30, 33, 34, 35]],
    
           [[36, 37, 38, 41, 42, 43, 46, 47, 48],
            [48, 49, 50, 53, 54, 55, 58, 59, 60]],
    
           [[61, 62, 63, 66, 67, 68, 71, 72, 73],
            [74, 75, 76, 79, 80, 81, 84, 85, 86]]])
    

    或者更短的 -

    a[...,(np.arange(a.shape[-1])%5)<3]
    

    使其通用/参数化 -

    group_size = 5
    ignore_size = 2
    out = a[...,(np.arange(a.shape[-1])%group_size)<(group_size-ignore_size)]
    

    【讨论】:

    • 真棒@Divakar。较短的和通用的做我想要的!我正要编辑我的问题以询问是否使其通用。无论如何我都会这样做,以防它鼓励其他人进一步阅读这个问题。
    【解决方案2】:

    只需选择您想要的索引:

    a=a[:,:,[0,1,2,5,6,7,10,11,12]]
    

    或者,以更一般的方式:

    a=a[:,:,[i for i in range(13) if i%5 in [0,1,2]]]
    

    输出:

    array([[[10, 11, 12, 15, 16, 17, 20, 21, 22],
            [23, 24, 25, 28, 29, 30, 33, 34, 35]],
           [[36, 37, 38, 41, 42, 43, 46, 47, 48],
            [48, 49, 50, 53, 54, 55, 58, 59, 60]],
           [[61, 62, 63, 66, 67, 68, 71, 72, 73],
            [74, 75, 76, 79, 80, 81, 84, 85, 86]]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2017-08-23
      • 1970-01-01
      • 2021-02-21
      • 2022-09-23
      • 2020-01-31
      相关资源
      最近更新 更多