从排序的numpy阵列中删除最小数量元素的最佳方法是什么,以便其余的最小距离始终大于某个阈值?
例如,如果阈值为1
,则以下序列[0.1, 0.5, 1.1, 2.5, 3.]
将成为[0.1, 1.1, 2.5]
。删除了0.5
,因为它离0.1
太近,但是保留了1.1
,因为它距离0.1
足够远。
我当前的代码:
import numpy as np
MIN_DISTANCE = 1
a = np.array([0.1, 0.5, 1.1, 2.5, 3.])
for i in range(len(a)-1):
if(a[i+1] - a[i] < MIN_DISTANCE):
a[i+1] = a[i]
a = np.unique(a)
a
array([0.1, 1.1, 2.5])
是否有更有效的方法?
请注意,我的问题类似于从numpy数组中删除值彼此接近但不完全相同的值。
您可以使用numpy.ufunc.acumulate到迭代数组的相邻对而不是 for
循环。
-
numpy.add.accumulate
示例或Itertools.Acumulate可能表现出最好的作品。 - 与numpy.FrompyFunc一起可以用作
ufunc
(通用函数(。
代码:(带有扩展的数组来交叉检查一些其他情况,但也可以与您的数组一起使用(
import numpy as np
MIN_DISTANCE = 1
a = np.array([0.1, 0.5, 0.6, 0.7, 1.1, 2.5, 3., 4., 6., 6.1])
print("original: n" + str(a))
def my_py_function(arr1, arr2):
if(arr2 - arr1 < MIN_DISTANCE):
arr2 = arr1
return arr2
my_np_function = np.frompyfunc(my_py_function, 2, 1)
my_np_function.accumulate(a, dtype=np.object, out=a).astype(float)
print("complete: n" + str(a))
a = np.unique(a)
print("unique: n" + str(a))
结果:
original:
[0.1 0.5 0.6 0.7 1.1 2.5 3. 4. 6. 6.1]
complete:
[0.1 0.1 0.1 0.1 1.1 2.5 2.5 4. 6. 6. ]
unique:
[0.1 1.1 2.5 4. 6. ]
有关执行时间的时间表,显示阵列长度约为20的周转。
- 您的代码对于5 的阵列长度更快(相对(
- 对于阵列长度>> 20累积选项速度大大提高(数组长度的时间〜35%300(