从numpy数组中删除多个切片

时间:2014-07-08 21:15:35

标签: python arrays numpy

我有一个给定的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没有获取切片列表?

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

3 个答案:

答案 0 :(得分:1)

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

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.

答案 1 :(得分:1)

您可以使用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])

但我觉得它不是很快。

答案 2 :(得分: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解决方案的一半时间。