【问题标题】:Numpy delete column out of 3d ArrayNumpy删除3d数组中的列
【发布时间】:2018-01-27 15:52:48
【问题描述】:

我有一个 3d Numpy 数组,例如:

array = np.array([[[1,2],[3,4]],[[0,5],[6,7]]])
=[[[1 2]
   [3 4]]
  [[0 5]
   [6 7]]]

我想删除同一列中的元素,例如第 1 列。所以结果应该是:

=[[[1]
   [3]]
  [[0]
   [6]]]

我尝试了 np.delete 功能:

print np.delete(array[:][:],1,axis=1)

但它并没有产生预期的结果,而是我得到:

=[[[1 2]]
  [[0 5]]]

我在 np 文档(Link) 中找到了这个:

np.delete(array, np.s_[::2], 1)

但这似乎只删除了奇数,我不知道如何修改它。 np.s 函数上的文档也没有让我更进一步。

任何帮助将不胜感激!

【问题讨论】:

  • 因为这是一个3d数组,你应该删除axis=2

标签: python arrays numpy multidimensional-array


【解决方案1】:

你的数组是一个维数组,所以如果你想删除最后一个索引的索引为1的项目,你应该使用:

np.delete(array[:][:], 1, <b>axis=2</b>)

请注意,您确实不需要需要[:][:] 部分:这将无效,因此您可以使用:

np.delete(<b>array</b>, 1, axis=2)

这将生成:

>>> np.delete(array, 1, axis=2)
array([[[1],
        [3]],

       [[0],
        [6]]])

【讨论】:

  • 如何从每个二维数组中只删除一个元素?
  • @mLstudent33:numpy 数组只能存储“矩形”数据,那么如何从二维数组中删除一个元素?
  • Van Onsen,谢谢,我通过在 for 循环中删除一行的列索引来制作副本以复制到。
【解决方案2】:

使用 axis= [0, 1] 删除在您使用 2d 数组时有效。随着尺寸的增加,相应的轴值也应该增加。 这应该可以。

np.delete(array[:][:], 1, axis=2)

【讨论】:

    【解决方案3】:

    您可以很好地使用基本切片,因为np.delete() 实际上并没有删除原始数组中的任何内容。相反,它会返回一份(您所请求的内容的副本)。

    In [242]: arr
    Out[242]: 
    array([[[1, 2],
            [3, 4]],
    
           [[0, 5],
            [6, 7]]])
    
    # select both slices, select all rows but only first column
    In [243]: arr[:, :, :1]
    Out[243]: 
    array([[[1],
            [3]],
    
           [[0],
            [6]]])
    
    # same case as above but you can omit the `:`s with a single `...`
    In [244]: arr[..., :1]
    Out[244]: 
    array([[[1],
            [3]],
    
           [[0],
            [6]]])
    
    # sanity check for no copy made
    In [245]: (arr[..., :1]).flags
    Out[245]: 
      C_CONTIGUOUS : False
      F_CONTIGUOUS : False
      OWNDATA : False   # <=========== NO copy
      WRITEABLE : True
      ALIGNED : True
      UPDATEIFCOPY : False
    

    但是,如前所述,np.delete() 将结果作为副本返回

    In [246]: np.delete(arr[:][:], 1, axis=2).flags
    Out[246]: 
      C_CONTIGUOUS : True
      F_CONTIGUOUS : False
      OWNDATA : True    # <========= Its own copy
      WRITEABLE : True
      ALIGNED : True
      UPDATEIFCOPY : False
    

    但是,如果您从原始数组切片,则在对结果进行任何更改时必须小心,以免意外更改原始数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多