如何在数组中删除每个第n个元素?
import numpy as np
x = np.array([0,10,27,35,44,32,56,35,87,22,47,17])
n = 3 # remove every 3rd element
有没有类似于 x[0::n]
相反的东西?我已经尝试了这个,但显然它不起作用:
for i in np.arange(0,len(x),n):
x = np.delete(x,i)
你离正确答案很近了…尝试将整个arange作为子序列传递给删除函数,而不是尝试逐个删除每个元素,例如:
del my_array[np.arange(3, 6)]
import numpy as np
x = np.array([0,10,27,35,44,32,56,35,87,22,47,17])
x = np.delete(x, np.arange(0, x.size, 3))
# [10 27 44 32 35 87 47 17]
只需将数组重塑成(n, -1)的形状即可:
import numpy as np
x = np.array([0,10,27,35,44,32,56,35,87,22,47,17])
x = x.reshape(-1,3)[:,1:].flatten()
# [10 27 44 32 35 87 47 17]
在我的计算机上,它的运行速度比使用 np.delete
的解决方案快了近两倍(说实话是1.8倍到1.9倍之间)。
您还可以轻松地执行精细操作,例如每n个值进行m次删除等。
array2d = np.arange(60).reshape(6, 10)
m, n = (3, 5)
remove = lambda x, q: x.reshape(x.shape[0], -1, q)[..., 1:].reshape(x.shape[0], -1).T
remove(remove(array2d, n), m)
array([[11, 12, 13, 14, 16, 17, 18, 19],
[21, 22, 23, 24, 26, 27, 28, 29],
[41, 42, 43, 44, 46, 47, 48, 49],
[51, 52, 53, 54, 56, 57, 58, 59]])
为了泛化到任何形状,请根据您的情况使用填充或缩小输入数组。
速度比较:
from time import time
'remove'
start = time()
for _ in range(100000):
res = remove(remove(array2d, n), m)
time() - start
'delete'
start = time()
for _ in range(100000):
tmp = np.delete(array2d, np.arange(0, array2d.shape[0], m), axis=0)
res = np.delete(tmp, np.arange(0, array2d.shape[1], n), axis=1)
time() - start
"""
'remove'
0.3835930824279785
'delete'
3.173515558242798
"""
因此,与numpy.delete相比,上述方法速度显著更快。
np.delete(x, slice(None, None, 3))
来完成此操作。 - Jaimenp.delete
是否使用原生的slice
对象! 即使在一个百万项的数组中,似乎也没有任何速度优势(实际上略微慢一点)- 但它很好知道 - 谢谢。 - Jon Clementsa = np.random.rand(1e6); %timeit np.delete(a, np.arange(0, 1e6, 3)) --> 100 loops, best of 3: 14.5 ms per loop; %timeit np.delete(a, slice(None, None, 3)) --> 100 loops, best of 3: 8.41 ms per loop
. - Jaimenp.delete(x, np.s_[::3])
,参见此处的最后一个示例以及np.s_
的文档此处。 - Levi Baguley