【问题标题】:intersection points of two lines by numpy [duplicate]numpy的两条线的交点[重复]
【发布时间】:2020-06-10 03:52:30
【问题描述】:

我想使用 numpy 在 python 中获得两条线的交点。我写了一段代码,但我无法完成代码。我有一条由 numpy 读取并由 matplotlib 绘制的 1000 点曲线。另外,我绘制了 y=0 线,目前,我想知道第一条曲线与 y = 0 线的交点数。如下图所示

代码如下:

import matplotlib.pyplot as plt
import numpy as np

#ll = np.linspace(min(x),max(x),1696)


with open('file1.txt', 'r') as f:
    lines = f.readlines()
    x = [float(line.split()[0]) for line in lines]
    y = [float(line.split()[1]) for line in lines]
    a = np.array(y)
    b = np.where (y==0)
print(b)

我们将不胜感激。

【问题讨论】:

  • 据我了解,这个问题不是很简单。您所做的基本上不是检查文件中的 y 坐标是否为零,而您想要的是由点产生的曲线的交点。一种方法是找到曲线方程,这是一个机器学习曲线拟合问题。第二种方法可以通过假设两个连续点之间的直线来近似解,并查看该直线是否与 y=0 相交。
  • @talos1904 正如我告诉你的那样,问题是“如何找到 y=0 与我没有直线方程的曲线的点数,所以不可能使用这种方式. 我们正在处理 2 个 numpy 数组 1st:当前曲线和 2nd:我们产生的线。现在,np.Where 应该可以工作,但不能。另外,另一种方法是做一个看起来不太有用的数学。
  • @BehzadJamali b = np.where(a==0) 一无所获。我的意思是结果什么都没有。不仅 a==0,即使更改为 a ==1 或任何其他值,也什么都不是。
  • 这取决于rtol 值。尝试将其增加到0.2,看看是否有任何结果
  • b = np.where(y==0) 更改为b = np.isclose(a, b, rtol=0.01)。请注意,您不能使用 == 检查两个浮点数是否相等!

标签: python numpy matplotlib math


【解决方案1】:

试试这个:

import numpy as np

a = np.random.random(20) * 2         # 20 random float numbers between 0 and 2
b = np.ones_like(a, dtype=np.float)  # 20 numbers equal to 1

epsilon = 0.05
solution = np.abs(a-b) < epsilon  # index of items in `a` that are close enough (epsilon) to `b`

print(solution)

您也可以使用:

solution = np.isclose(a,b, rtol=epsilon)

【讨论】:

  • 我使用了基于我的数据,但有一个问题可以通过编辑您的答案与您分享。
【解决方案2】:

您正在尝试做的只是一个过零问题。保证过零计数的蛮力方法。从技术上讲,也可用于检查任何线路。只需要稍微改变条件语句。假设处于 0 处不算作过零。请注意,这些点需要是为了使它起作用。

y = [0,1,2,3,2,1,0,-1,0,0,1,-2,5,-6,0]
counter = 0
last_non_zero = None #buffer for handling zeroes
for i in range(len(y)-1):
    if y[i] == 0 and i == 0:
        pass
        #First item we ignore for zero crossing if start at 0
    elif y[i] == 0 and i!=0:
        if last_non_zero is not None and last_non_zero*y[i+1]<0
            counter += 1
            #handles 0 values 
    else:
        if y[i] * y[i+1] <0:
            counter +=1 #Condition for last value unnecessary since n*0 = 0 which is not <0
    if y[i] != 0:
        last_non_zero = y[i] #replace buffer

使用 ++ = +、--=+、+-=-、-+=- 的逻辑,其中最后两个是过零。

【讨论】:

  • 我明白了代码背后的想法,但我没有明白如何查看计数器值。我的意思是在运行你的代码之后,就输出而言什么都不会发生。
  • 只需致电柜台即可。交叉点数 = 计数器。
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多