首页 > 解决方案 > 在实数数组中找到最近元素的最快方法

问题描述

对于每个元素的给定实数数组,找到小于当前元素不超过的元素数0.5并写入新数组。

例如:

原始数组:

[0.1, 0.7, 0.8, 0.85, 0.9, 1.5, 1.7]

结果数组:

[0,   0,   1,   2,    3,   0,   1]

解决这个问题的算法和方法是什么?

重要的是仅在负方向上选择点的邻域,这使得无法使用KdtreeorBalltree算法。

我所有的问题都在这里,我尝试编写代码。

标签: pythonsearchtreebinary-search-treekdtree

解决方案


这将解决您的特定任务。

def find_nearest_element(original_array):
    result_array = []
    for e in original_array:
        result_array.append(len(original_array[(e-0.5 < original_array) & (e > original_array)]))
    return result_array

original_array = np.array([0.1, 0.7, 0.8, 0.85, 0.9, 1.5, 1.7])
print(find_nearest_element(original_array))

输出:

[0, 0, 1, 2, 3, 0, 1]

编辑:对于较小的数组(ca. len 10000),使用掩码显然比使用 numba 的版本快。对于更大的阵列,使用 Numba 的版本更快。因此,这取决于您要进行的数组大小。

一些运行时比较(以秒为单位):

For smaller arrays(size=250):
Using Numba 0.2569999694824219
Using mask 0.0350041389465332
For bigger arrays(size=40000):
Using Numba 1.4619991779327393
Using mask 4.280000686645508

我设备上的盈亏平衡点大约是 10000 大小(两者都需要大约 0.33 秒)。


推荐阅读