在1d列表的值中检测交叉的最简单方法是什么?

时间:2015-11-15 07:42:26

标签: python numpy

假设我在Python中有两个列表:

a = [1, 2, 3, 4, 5, 6] # y values of a line
b = [7, 6, 4, 4, 8, 4] # x values are index location of the list

// result = [F, F, F, T, F, T]

现在,如果你能想象这些点代表2行,a和b。 线a刚刚线性上升(虽然这是任意的),而线b下降并首先接触到x = 4的位置,然后越过x = 6的位置。

我想做的是,有一个简单的Pythonic解决方案,用于检测线条接触或交叉的时间。我想知道numpy或其他一些图书馆是否已经可以做到这一点。

编辑: 我写了这个装置,我认为它可以检测到交叉。 aa <= bb;aa >= bb也应该让它检测到触摸。

# check if lines crossed in past X bars
def cross(a, b, bars=3):
    aa = np.array(a[-bars:])
    bb = np.array(b[-bars:])

    if len(np.unique(aa < bb)) == len(np.unique(aa > bb)) == 1:
        return False

    return True

2 个答案:

答案 0 :(得分:1)

首先区分两行。

difference=a-b

如果差异的符号从项目变为下一个项目(触摸时它将为空),则会出现交叉点。你可以这样:

cross=(np.sign(difference*np.roll(difference,1))<1)[1:]

[1:]是丢弃第一个不相关的点。 cross是True if 就在前面有一个十字路口。

一个完整的例子:

import numpy as np
import matplotlib.pyplot as plt
a=np.random.randint(0,20,20)
b=np.random.randint(0,20,20)
plt.close()
plt.plot(a,'*-')
plt.plot(b,'*-')
difference=a-b
cross=(np.sign(difference*np.roll(difference,1))<1)[1:]
plt.plot(np.arange(.5,19),10* cross, 'd')

每次片段交叉时都会有一颗红色钻石。在这种方法中,触摸被视为双重接触。

crossing lines

答案 1 :(得分:0)

如果相同索引处的ab的值相同,则触摸两行,如果a的上一个值上一个值{{ 1}},b的当前值下降到a的当前值,然后两行交叉。使用b同时迭代zipa,并使用变量b存储以前的信息。

previous