首页 > 解决方案 > 将带有函数的 for 循环转换为列表理解(使用 numpy 数组)以查找两个列表之间的最小值

问题描述

我有兴趣有效地对两个非常长的排序列表进行排序以找到最接近的对。我当然可以编写两个 for 循环,但是对于列表中的长元素,此代码非常慢。稍微阅读一下,“numpy 数组”似乎特别快,并且类似于 Matlab(我在使用 for 循环“矢量化”代码方面有经验)。

其中一个答案提出了一种在 numpy 数组中查找最近值的快速方法。因此,我需要为两个列表执行此操作,就是遍历一个列表的值:

import numpy as np
import numpy.matlib
import glob
import time
import math
def find_nearest(array,value):
    idx = np.searchsorted(array, value, side="left")
    if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) < math.fabs(value - array[idx])):
        return array[idx-1]
    else:
        return array[idx]

x1 = np.array([1, 3, 4, 5, 19]);
x2 = np.array([6, 18, 24, 36, 37]);
dtarray = numpy.array([]);
for i in range(x1.size):
    dtarray = np.append(dtarray, math.fabs(x2[i]-find_nearest(x1, x2[i])))

print(dtarray)

我已经消除了一个 for 循环,现在我有兴趣进一步加快它的速度。似乎列表理解对这项任务很有用(也许我可以弄清楚如何并行化它们) - 但我无法让它们工作:

dtarray2 = [math.fabs(x2[i]-find_nearest(x1, x2[i])) for i in range(x1.size)]   

这个语法不正确吗?我收到消息:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<timed exec> in <module>

<timed exec> in <listcomp>(.0)

NameError: name 'x2' is not defined

标签: pythonarraysnumpy

解决方案


推荐阅读