【问题标题】:Deleting multiple slices from a numpy array从 numpy 数组中删除多个切片
【发布时间】:2014-07-08 21:15:34
【问题描述】:

我有一个给定的 numpy 数组和一个包含许多切片对象的列表(或者包含 (start, end) 元组)。我正在寻找从原始数组中删除切片对象位置并获得具有剩余值的第二个数组。

玩具示例:

myarray = np.arange(20)

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

mylist=(slice(2,4),slice(15,19))

做某事,结果应该是

array([0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

数组可以有几十万,切片对象列表可以包含几千个元素,我需要经常运行操作,所以速度有点重要。

据我所知,Numpy delete 没有获取切片列表?

现在我正在生成我的切片对象列表的补码并对其进行切片,但是生成补码是一个有点尴尬的过程,我对切片列表进行排序然后遍历它,根据需要创建补码切片对象。我希望有一种我没有想到的更优雅的方式!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用set() 标识将保留哪些位置,并使用np.take() 获取相应的值,执行以下操作:

    ind = np.indices(myarray.shape)[0]
    rm = np.hstack([ind[i] for i in mylist])
    
    ans = np.take(myarray, sorted(set(ind)-set(rm)))
    

    请注意,np.hstack() 用于获取单个数组,其中包含将被删除的所有索引。这大约需要@HYRY 解决方案的一半时间。

    【讨论】:

      【解决方案2】:

      我想不出一种干净地加入切片的方法;但是,我认为使用复合材料是可行的方法。也许尝试这样的事情:

      import numpy as np
      
      # Create test data
      n_data = 1000000
      n_slices = 10000
      
      data = np.arange(n_data)
      slices = []
      for i in range(n_slices):
          r = np.random.randint(n_data-1000)
          slices.append(slice(r,r + np.random.randint(1000)))
      
      # Remove slices
      keep_mask = np.ones_like(data, dtype=bool)
      for slice in slices: keep_mask[slice] = False
      data = data[keep_mask] # or np.take, etc.
      

      【讨论】:

        【解决方案3】:

        您可以使用np.r_[] 将切片加入数组中:

        myarray = np.arange(20)
        mylist=(slice(2, 4),slice(15, 19))
        np.delete(myarray, np.r_[tuple(mylist)])
        

        输出:

        array([ 0,  1,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 19])
        

        但我认为这不是很快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-05
          • 1970-01-01
          • 2017-09-10
          • 2019-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多