我对Python还是很陌生,所以我无法解决一个琐碎的问题。 我需要创建一条由连接某些点的直线组成的复合线。 我有一个txt文件,其中包含点的2D(x-y)坐标集。我正确地读取了文件并将数据存储在数据框中。然后使用for循环,获取两个连续的点,并使用numpy函数polyfit找到通过这些点的线的系数(coefficients_i)。然后,我创建了连接点(yaxis_i)的直线的单个线段,但是我不能创建由不同线段组成的单个合成线。我的行应为:yaxis_i + yaxis_(i + 1)+ ... + yaxis_(i + n),我希望将其存储在数据框中,以便可以轻松绘制它。我试图将不同的段追加到numpy.ndarray中,但它似乎不起作用。这是代码:
d = []
e = []
for i in range(len(ln_pts)-1):
x_i = [ln_pts.iat[i+1,0],ln_pts.iat[i,0]]
y_i = [ln_pts.iat[i+1,1],ln_pts.iat[i,1]]
coefficients_i = np.polyfit(x_i, y_i, 1)
print('m',i,' =', coefficients_i[0])
print('q',i,' =', coefficients_i[1])
# Compute the values of the lines (yaxis) in a given domain (xaxis)
polynomial_i = np.poly1d(coefficients_i)
xaxis_i = np.arange(x_i[1],x_i[0])
yaxis_i = polynomial_i(xaxis_i)
d.append(xaxis_i)
e.append(yaxis_i)
有解决这个问题的主意吗? 谢谢
答案 0 :(得分:0)
您不需要 创建多项式拟合,然后在更密集的x
值集合中进行插值。此操作称为<逐段线性插值。 Numpy已经有一个interp()
可以为您完成此操作。
除非您在下游使用熊猫,否则也无需将熊猫引入方程式。
pts = np.loadtxt('myfile.txt')
wanted_xpts = np.linspace(pts[:, 0].min(), pts[:, 0].max(), 10000)
interp_ypts = np.interp(wanted_xpts, pts[:, 0], pts[:, 1])
plt.plot(pts[:, 0], pts[:, 1], 'or')
plt.plot(wanted_xpts, interp_ypts, '-k')
plt.show()
您绝对必须使用循环吗?这是不必要且效率低下的,但是无论如何您都可以在这里进行:
您的代码通常可以胜任此工作。无需计算多项式拟合。您可以将interp
与x_i
和y_i
一起使用。
d, e = [], []
for i in range(len(ln_pts)-1):
x_i = [ln_pts.iat[i+1,0],ln_pts.iat[i,0]]
y_i = [ln_pts.iat[i+1,1],ln_pts.iat[i,1]]
xaxis_i = np.linspace(x_i[1], x_i[0], 10)
yaxis_i = np.interp(xaxis_i, x_i, y_i)
d.append(xaxis_i)
e.append(yaxis_i)
现在,您在d
和e
的各个列表中拥有每个分段的所有新x和y点。您可以简单地使用np.hstack
将所有这些堆栈堆叠到一个一维数组中。
xpts = np.hstack(d)
ypts = np.ystack(e)
然后,您可以根据需要将它们分配给数据框列。