从numpy数组中删除多个切片

ano*_*ell 9 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))
Run Code Online (Sandbox Code Playgroud)

做一些事情,结果应该是

array([0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
Run Code Online (Sandbox Code Playgroud)

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

就我所见,Numpy delete不会获取切片列表?

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

Sau*_*tro 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)))
Run Code Online (Sandbox Code Playgroud)

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