【发布时间】:2015-08-02 05:43:42
【问题描述】:
我正在将代码从 MATLAB 转换为 python,以加快简单的操作。我编写了一个包含嵌套循环和条件语句的函数;循环的目的是返回与数组 y 相比时数组 x 中最近元素的索引列表。我按 1e5 个项目的顺序进行比较,运行时间约为 30 秒。任何有助于加快此过程的帮助将不胜感激!我在使用 numba-pro 自动即时编译器方面取得了部分成功:
@autojit()
def find_nearest(x,y,idx):
idx_old = 0
rng1 = range(y.shape[0])
rng2 = range(x.shape[0])
for i in rng1:
prev = abs(x[idx_old]-y[i])
for j in rng2:
if abs(x[j]-y[i]) < prev:
prev = abs(x[j]-y[i])
idx_old = j
idx[i] = idx_old
return idx
对不起,我是个菜鸟,我是python的新手!
【问题讨论】:
-
您能否更新您的脚本以包含
find_nearest的示例数据输入,这样就清楚了吗? -
例如 x = np.array([1.1,2.3,5.9,8.5]), y = np.array([0.2, 5.5, 12]) 和 idx = np.zeros(np. shape(y)) 应该返回 idx = [0,2,3] (x 中最接近 y 中的项目的索引。在 MATLAB 中,我使用 knnsearch 执行此操作,在我的大型数据集上大约需要 2.5 秒解决;而我的实现大约需要 30 秒。输入数组不需要按任何特定的排序顺序。谢谢你看!
-
我尝试使用 sci-kitlearn 的 k-nearest-neighbors 实现,但是它返回了一个在数据集上训练的函数;并且对我的完整数据集进行培训是不可行的。我的搜索域包含 1023848 个项目,我正在尝试在其中找到 12325 个最接近的项目。
标签: performance python-2.7 numpy conditional-statements numba