从numpy数组中删除多个切片

9
我有一个给定的numpy数组和一个包含一些切片对象(或者包含(起始位置,结束位置)元组)的列表。我想从原始数组中删除切片对象位置,并获得第二个数组,其中包含剩余的值。
玩具例子:
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个回答

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

但我认为它不是很快。

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
你可以使用 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 的解决方案快了约一半时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接