【发布时间】:2018-01-03 02:39:29
【问题描述】:
我有一个复数列表,我想在另一个复数列表中找到最接近的值。
我目前使用 numpy 的方法:
import numpy as np
refArray = np.random.random(16);
myArray = np.random.random(1000);
def find_nearest(array, value):
idx = (np.abs(array-value)).argmin()
return idx;
for value in np.nditer(myArray):
index = find_nearest(refArray, value);
print(index);
不幸的是,这需要很长时间才能获得大量值。 是否有更快或更“pythonian”的方式将 myArray 中的每个值与 refArray 中最接近的值匹配?
仅供参考:我的脚本中不一定需要 numpy。
重要提示: myArray 和 refArray 的顺序都很重要,不应更改。如果要应用排序,则应以某种方式保留原始索引。
【问题讨论】:
-
就时间复杂度而言,滑动窗口可能是最有效的。
-
我看不出滑动窗口比当前解决方案更有效。据我所知,目前的解决方案是 O(n),这是最好的希望。然后,为了最小化时间常数,需要做一些权衡。但这取决于你的大案子是否会爆炸你的记忆。如果不是内存问题,使用广播可能会有所收获并使用更多
numpy计算,但如果 RAM 内存是一个问题,这也可能会减慢您的速度。 -
@JohanL RAM 不是问题,不幸的是时间是问题。这个简单的循环是我能想到的最简单但也是最好的方法。不幸的是,数组大小为 ref=64 和 values=200,000,匹配需要超过 10 秒,目标将远低于 1 秒...跨度>
-
你可以试试
scipy.spatial.KDTree.query。