如何用pythonic方式找到单线方程阵列的线交点

时间:2017-07-18 09:23:01

标签: python performance python-3.x numpy

在不使用for循环的情况下,在由m,c值组成的数组中找到行交叉点的最pythonic方法是什么?

lines=np.array([m0,c0],
               [m1,c1],
               [m2,c2],
               ....)

使用for循环实现所需的结果将包括:

for i in lines:
 for n in lines:
   np.linalg.solve(i, n)

1 个答案:

答案 0 :(得分:4)

y1 = a1*x + b1y2 = a2*x + b2两条线的交点公式为x = (b2 - b1) / (a1 - a2)

通过使用broadcasting,可以轻松计算任意数行之间的所有交叉点:

import numpy as np    

# lines of the form y = a * x + b
# with lines = [[a0, b0], ..., [aN, bN]]
lines = np.array([[1, 0], [0.5, 0], [-1, 3], [1, 2]])

slopes = lines[:, 0]  # array with slopes (shape [N])
slopes = slopes[:, np.newaxis]  # column vector (shape [N, 1])

offsets = lines[:, 1]  # array with offsets (shape [N])
offsets = offsets[:, np.newaxis]  # column vector (shape [N, 1])

# x-coordinates of intersections
xi = (offsets - offsets.T) / (slopes.T - slopes) 

# y-coordinates of intersections
yi = xi * slopes + offsets

这可以通过将元素方式-运算符应用于形状[N,1]的列向量来实现,并且它是形状[1,N]的转置。矢量被广播到形状[N,N]的矩阵。

最终结果是两个对称矩阵xiyi。每个条目xi[m, n]都是行mn的交集。 nan表示线条相同(它们在每个点相交)。 inf表示行不相交。

让我们展示一下结果:

#visualize the result
import matplotlib.pyplot as plt
for l in lines:
    x = np.array([-5, 5])
    plt.plot(x, x * l[0] + l[1], label='{}x + {}'.format(l[0], l[1]))
for x, y in zip(xi, yi)    :
    plt.plot(x, y, 'ko')
plt.legend()
plt.show()

enter image description here