在for循环中从numpy.ndarray创建一个熊猫数据框

时间:2020-09-15 16:42:01

标签: python dataframe for-loop

我对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)

有解决这个问题的主意吗? 谢谢

1 个答案:

答案 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()

绝对必须使用循环吗?这是不必要且效率低下的,但是无论如何您都可以在这里进行:

您的代码通常可以胜任此工作。无需计算多项式拟合。您可以将interpx_iy_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)

现在,您在de的各个列表中拥有每个分段的所有新x和y点。您可以简单地使用np.hstack将所有这些堆栈堆叠到一个一维数组中。

xpts = np.hstack(d)
ypts = np.ystack(e)

然后,您可以根据需要将它们分配给数据框列。