python - 将带有函数的 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
解决方案
推荐阅读
- nginx - 如何为 nginx 上的不同端口使用一个 ssl 证书
- json - “未找到:URI gs://”文件实际存在于存储桶 URI 中时出错
- ios - 在不将其发布到 iCloud Drive 的情况下使用 iCloud 容器是否正常?
- intersystems-iris - 如何以编程方式关闭 IRIS 中的日记功能
- c - 如何防止计数器重新启动?
- javascript - 删除在 Javascript 中使用 Xpath 找到的元素
- css - 嗨,我想在将字符串值传递给道具时添加换行符
- css - 溢出容器与其滚动条之间的间距(纯 CSS)
- java - 将第二张地图的细节同化到第三张地图中
- java - Vaadin Flow 如何在 Grid 中控制焦点 TextField?