Python 确定不出现在任何数组中的元素范围

Python 确定不出现在任何数组中的元素范围,python,arrays,numpy,Python,Arrays,Numpy,我有几个表示x坐标和y坐标的数组。我想做的是确定y范围,对于该范围,所有结果线都不会彼此重叠。为了说明我的意思,我编写了以下代码: import numpy import matplotlib.pyplot as plt x1, y1 = numpy.array([1., 2., 3., 4., 5., 6.]), numpy.array([5., 6., 7., 8., 9., 10.5]) x2, y2 = numpy.array([1., 2., 3., 4., 5., 6.]), nu

我有几个表示x坐标和y坐标的数组。我想做的是确定y范围,对于该范围,所有结果线都不会彼此重叠。为了说明我的意思,我编写了以下代码:

import numpy
import matplotlib.pyplot as plt

x1, y1 = numpy.array([1., 2., 3., 4., 5., 6.]), numpy.array([5., 6., 7., 8., 9., 10.5])
x2, y2 = numpy.array([1., 2., 3., 4., 5., 6.]), numpy.array([7., 4., 3., 2., 1., 0.])
x3, y3 = numpy.array([1., 2., 3., 4., 5., 6.]), numpy.array([0., 7.5, 8.5, 4., 3., 5.])
x4, y4 = numpy.array([1., 2., 3., 4., 5., 6.]), numpy.array([14., 17., 16., 20., 19., 18.])
x5, y5 = numpy.array([1., 2., 3., 4., 5., 6.]), numpy.array([20., 18., 16., 13.5, 16., 17.])

plt.figure()

plt.plot(x1, y1)
plt.plot(x2, y2)
plt.plot(x3, y3)
plt.plot(x4, y4)
plt.plot(x5, y5)

plt.axhline(10.5, color = "black", ls = "dashed")
plt.axhline(13.5, color = "black", ls = "dashed")

plt.xlim(1, 6)
plt.ylim(0, 20)

plt.show()
此代码生成以下图像:

在本例中,有5组x和y数据数组。存在一个特定范围(由水平黑色虚线指示),对于该范围,没有任何数据阵列相对于y轴彼此重叠

如何确定该区域?很抱歉,对于如何解决这个问题,我没有任何建议,因为我甚至不知道在这种情况下应该使用哪些搜索词


多谢各位

我想我对这一点的理解是正确的

我们可以通过将所有数据集组合在一起来简化问题

>>> combined = [5., 6., 7., 8., 9., 10.5] + [7., 4., 3., 2., 1., 0.] + [0., 7.5, 8.5, 4., 3., 5.] + [14., 17., 16., 20., 19., 18.] + [20., 18., 16., 13.5, 16., 17.]
>>> combined
[5.0, 6.0, 7.0, 8.0, 9.0, 10.5, 7.0, 4.0, 3.0, 2.0, 1.0, 0.0, 0.0, 7.5, 8.5, 4.0, 3.0, 5.0, 14.0, 17.0, 16.0, 20.0, 19.0, 18.0, 20.0, 18.0, 16.0, 13.5, 16.0, 17.0]
接下来,我们需要对组合列表进行排序

>>> combined.sort()
从那里,剩下的就是通过生成器对象将数字配对

>>> pairs = ((combined[i], combined[i-1]) for i in range(1, len(combined)))
并找出任何一对中的值之间的最大差异

>>> max(pairs, key=lambda x:x[0]-x[1])
(13.5, 10.5)

希望这有用。

IIUC,这基本上是一个重叠间隔问题。从中窃取代码——老实说,我还没有真正测试过,但是一旦你知道关键字是“merge overlap interval”,就会发现很多实现——你可以合并y范围。例如:

def merge(times):
    if not times: return
    saved = list(times[0])
    for st, en in sorted(sorted(t) for t in times):
        if st <= saved[1]:
            saved[1] = max(saved[1], en)
        else:
            yield tuple(saved)
            saved = [st, en]
    yield tuple(saved)

ys = [y1, y2, y3, y4, y5]
mms = [[y.min(), y.max()] for y in ys]
used = list(merge(mms))
unused = [(low[1], high[0]) for low, high in zip(used, used[1:])]

其中,
used
是一个有数据的y波段列表,
unused
是一个没有数据的y波段列表。

好的,虚线区域不仅仅包含“无重叠”区域,它包含一个数组根本没有数据的区域。如果你在寻找“无重叠”,它会延伸到紫色和深蓝色,不是吗?我不太明白你的问题。你到底想干什么?你事先知道“差距”在哪里吗?总有(确切地)一个差距吗?“用笔和纸”怎么解决你的问题?@TheSoundDefense是的,我正在寻找一个数组没有任何数据的区域。@Jasper我想要的是画两条虚线。通常我会查看每个数据集的情况。这意味着我会看一个像这样的图形,然后看虚线所在的眼珠。然后,我将确定构成该“无重叠”区域的数据数组的最小值和最大值。在本例中,这意味着深蓝色线的最大值和紫色线的最小值。这些值用于绘制虚线。但是,将需要多次执行此操作,因此希望自动化此过程。可能会有一些差距。当这个答案出现时,我正在执行扫描线算法。有什么是Python没有函数的吗?当我使用您在我的实际数据集上发布的答案时,我还获得了“区域”,它们显然不是区域。我无法指出它出错的原因,因此无法包含使用代码获得的故障区域的工作示例。你知道你的代码何时/何地/为什么会出错吗?非常感谢您的帮助。谢谢您的回答。有没有办法使此代码也适用于多个“无重叠”区域?
>>> used
[(5.0, 10.5), (13.5, 20.0)]
>>> unused
[(10.5, 13.5)]