如何不使用numpy从python中的线方程中提取系数?

时间:2019-07-09 08:36:27

标签: python regex matplotlib

我有2个以(x,y)元组形式的红色和蓝色列表,以及以ax + by + c形式的线方程列表。我的要求是从每个线方程中提取系数,并基于两点集的图确定线两边的点是否明显分开。 挑战是我不能使用numpy。

我的方法是使用pyplot压缩2个列表的RED和BLUE点。现在,我尝试使用正则表达式提取系数,如下所示。

lines = ["1x+1y+0","1x-1y+0","1x+0y-3","0x+1y-0.5"]

for i in lines:
    z = re.match('(\d+)?(x)?\+(\d+)?(y)?\+(\d)?', i)

但是,我不能使用'z',因为它是'NoneType'。即使我能够以某种方式使用它,也不确定如何使用截距和斜率来确定RED和BLUE点在直线的两侧。

任何指针都将受到高度赞赏。

尝试使用matplotlib绘制点

Red_x = [(x,y) for x,y in Red]
Blue_x = [(x,y) for x,y in Blue]

plt.plot(*zip(*Red_x),'or')
plt.scatter(*zip(*Blue_x))

4 个答案:

答案 0 :(得分:1)

我相信您要使用的是findall

您可以从简单的[\d\.\-\+]+模式开始。假设系数格式正确(例如,数字中没有双倍的句点),这将捕获所有系数。

>>> lines = ["1x+1y+0", "1x-1y+0", "1x+0y-3", "0x+1y-0.5"]
>>> for i in lines:
...     z = re.findall(r'[\d\.\-\+]+', i)
...     print(z)
... 
['1', '+1', '+0']
['1', '-1', '+0']
['1', '+0', '-3']
['0', '+1', '-0.5']

很显然,您必须对生成的字符串列表进行一些额外的解析,才能将它们转换为数字,但这将是您的练习:)

答案 1 :(得分:1)

import re
s = "1x-2.1y-0.5"
s = [float(i) for i in re.split('[xy]', s)]
print(s)

[1.0,-2.1,-0.5]

答案 2 :(得分:0)

import re
str = "112x-12y+0"
res = re.findall(r'[0-9\-\+]+', str)
print(res)

输出: ['112','-12','+ 0']

答案 3 :(得分:0)

此解决方案将考虑方程式项x,y,c的放置顺序。

import re

all_equations = ["1x+1y+2", "-1x+12Y-6", "2-5y-3x", "7y-50+2X", "3.14x-1.5y+9", "11.0x-1.5y+9.8"]

def CoefficientIntercept(equation):
    coef_x = re.findall('-?[0-9.]*[Xx]', equation)[0][:-1]
    coef_y = re.findall('-?[0-9.]*[Yy]', equation)[0][:-1]
    intercept = re.sub("[+-]?\d+[XxYy]|[+-]?\d+\.\d+[XxYy]","", equation)    

    return float(coef_x), float(coef_y), float(intercept)

for equation in all_equations:
    print(CoefficientIntercept(equation))

输出:

(1.0, 1.0, 2.0)
(-1.0, 12.0, -6.0)
(-3.0, -5.0, 2.0)
(2.0, 7.0, -50.0)
(3.14, -1.5, 9.0)
(11.0, -1.5, 9.8)