在不使用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)
答案 0 :(得分:4)
y1 = a1*x + b1
和y2 = 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]的矩阵。
最终结果是两个对称矩阵xi
和yi
。每个条目xi[m, n]
都是行m
和n
的交集。
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()