<p>下面是一个可行方法的概要。你知道吗</p>
<p>按<code>z</code>的值按递增顺序对每个数据集排序:即<code>z_1</code>和<code>z_2</code>。然后为每个数据集设置一个索引。扫描它们,当该数据集中的项太低而无法与另一个数据集中指向的项进行比较时,前进一个索引。当比较的项目足够接近时,对这对项目进行操作。当两个索引都到达其数据集的末尾时,就完成了。这类似于mergesort的实现方式。不同大小的数据集不会影响算法。你知道吗</p>
<p>这个算法看起来并不特别像python,它没有使用numpy的优点,但是它的优点是它可以工作。第二阶段具有时间复杂性<code>O(n)</code>,因此速度很快。排序阶段具有时间复杂性<code>O(n log(n))</code>,因此它是缓慢的部分。你知道吗</p>
<hr/>
<p>关于您添加的代码尝试:<code>i</code>和<code>j</code>对于值<code>z_1</code>和<code>z_2</code>来说是糟糕的变量名。如果<code>ndx1</code>和<code>ndx2</code>是两个数据集的索引,相等的“阈值”是<code>threshold</code>,则可以使用以下方法测试近似相等:</p>
<pre><code>if abs(z_1[ndx1] - z_2[ndx2]) < threshold:
do_whatever
</code></pre>
<p><code>threshold</code>的值类似于<code>1e-5</code>。你知道吗</p>
<p>但这里的代码与您想要的更为密切相关。这假设数据集已经设置好并按它们的<code>z</code>值排序。你知道吗</p>
<pre><code>threshold = 1e-5
length1, length2 = len(z_1), len(z_2)
if length1 == 0 or length2 == 0:
return
ndx1 = ndx2 = 0
z1, z2 = z_1[0], z_2[0]
while True:
if z1 + threshold <= z2: # z_1 too low
ndx1 += 1
if ndx1 == length1:
return
z1 = z_1[ndx1]
elif z2 + threshold <= z1: # z_2 too low
ndx2 += 1
if ndx2 == length2:
return
z2 = z_2[ndx2]
else: # z_1 and z_2 almost equal
do_whatever
# adjust ndx1, ndx2
</code></pre>
<p>这只是一副骷髅。最后如何调整<code>ndx1</code>和<code>ndx2</code>,取决于是否允许<code>z_1</code>的一个值几乎大于<code>z_2</code>的值或相反。你知道吗</p>