gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:34:35 25 4
gpt4 key购买 nike

假设我在 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 的 a,然后越过 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

最佳答案

先求出两条线的不同

difference=a-b

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

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

[1:] 是丢弃第一个不相关的点。 cross 为 True 如果前面有个路口。

一个完整的例子:

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

关于python - 检测 1d 列表值交叉的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33717492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com