每隔n次删除numpy数组中的一系列元素

Kev*_*n91 5 python arrays numpy

我知道如何删除numpy数组中的每个第4个元素:

frame = np.delete(frame,np.arange(4,frame.size,4))
Run Code Online (Sandbox Code Playgroud)

现在,我想知道是否有一个简单的命令可以删除每n个(例如4个)乘以3个值。

一个基本的例子:

输入:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ....]

会导致:

输出:[1,2,3,7,8,9,13,14,15,19,20,....]

我希望有一个简单的numpy / python功能,而不是编写必须在向量上进行迭代的函数(因为在我看来,这很长,...)。

谢谢您的帮助

Dan*_*l F 2

使用布尔索引的方法:

\n\n
def block_delete(a, n, m):  #keep n, remove m\n    mask = np.tile(np.r_[np.ones(n), np.zeros(m)].astype(bool), a.size // (n + m) + 1)[:a.size]\n    return a[mask]\n
Run Code Online (Sandbox Code Playgroud)\n\n

与@Divakar比较:

\n\n
def mod_delete(a, n, m):\n    return a[np.mod(np.arange(a.size), n + m) < n]\n\na = np.arange(19) + 1\n\n%timeit block_delete(a, 3, 4)\n10000 loops, best of 3: 50.6 \xc2\xb5s per loop\n\n%timeit mod_delete(a, 3, 4)\nThe slowest run took 9.37 times longer than the fastest. This could mean that an intermediate result is being cached.\n100000 loops, best of 3: 5.69 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

让我们尝试更长的数组:

\n\n
a = np.arange(999) + 1\n\n%timeit block_delete(a, 3, 4)\nThe slowest run took 4.61 times longer than the fastest. This could mean that an intermediate result is being cached.\n10000 loops, best of 3: 54.8 \xc2\xb5s per loop\n\n%timeit mod_delete(a, 3, 4)\nThe slowest run took 5.13 times longer than the fastest. This could mean that an intermediate result is being cached.\n10000 loops, best of 3: 14.5 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

还更长:

\n\n
a = np.arange(999999) + 1\n\n%timeit block_delete(a, 3, 4)\n100 loops, best of 3: 3.93 ms per loop\n\n%timeit mod_delete(a, 3, 4)\n100 loops, best of 3: 12.3 ms per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以哪个更快取决于数组的大小

\n