pythonic的方法可以从Numpy阵列中删除比阈值更近的元素



从排序的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(

最新更新