为了账号安全,请及时绑定邮箱和手机立即绑定

用零填充不均匀分布点列表的缺失值

用零填充不均匀分布点列表的缺失值

PHP
慕标5832272 2023-11-09 14:42:06
我将一组点保存为数据帧 dp:xlist   ylist0   0.017108    0.9024941   0.019659    0.7419812   0.030310    0.9208843   0.032064    0.2558264   0.046168    0.5627615   0.060758    0.5830446   0.118274    1.0000007   0.125385    1.0000008   0.140418    1.0000009   0.153699    1.00000010  0.186998    0.29374311  0.215375    0.11228812  0.217875    0.26088313  0.250591    0.32595314  0.262788    0.08491615  0.287382    0.10491016  0.325902    0.08841817  0.377885    0.31202518  0.473086    0.06863219  0.485449    0.05962420  0.557334    0.73437621  0.572133    0.70939222  0.610553    0.84068723  0.626902    0.73793024  0.630276    0.08478725  0.637779    0.09153526  0.717553    0.07441127  0.742187    0.09277028  0.757873    0.53288129  0.780933    0.52820230  0.836708    0.42261531  0.920814    0.35989632  0.938639    0.35524133  0.954564    0.28098934  0.978567    0.64974935  0.995067    0.769272使用 pyplot.vlines 时,它们如下所示:[plt.vlines(x,0,y) for x,y in zip(dp.xlist, dp.ylist)]plt.show()我想用以下代码替换 xlist:x = linspace(0,1,num=100) ###(or num=200... not important)并使用 ylist 中的值创建一个新的 y,其中 x 接近 xlist,并在其他位置为零。到目前为止,我尝试的是对于每对 xlist、ylist 值,我检查我的线性空间中是否有一个点足够接近 xlist 中的点,然后为其分配相应的 ylist 值,否则,我放一个零。for i in dp.index:    fill = []     for xa in x:        if abs(dp.xlist[i]-xa)<0.001:            tmp = dp.ylist[i]        else:            tmp = 0        fill.append(tmp)但我想我正在覆盖列表“填充”,这就是为什么它不起作用,但我不知道如何解决这个问题。有没有一种快速简单的方法可以实现这一目标?
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

无需循环。您可以使用 pandas 方法:


dp['x_lin'] = x[np.abs(np.subtract.outer(x,dp.xlist.values)).argmin(0)]

dp['y_lin'] = 0

dp.y_lin[np.abs(dp.x_lin-dp.xlist)<0.001] = dp.ylist

您也可以将第一行替换为等效行:


dp['x_lin'] = x[np.abs(x[None,:]-dp.xlist[:,None]).argmin(1)]

输出:


       xlist     ylist     x_lin     y_lin

0   0.017108  0.902494  0.020202  0.000000

1   0.019659  0.741981  0.020202  0.741981

2   0.030310  0.920884  0.030303  0.920884

3   0.032064  0.255826  0.030303  0.000000

4   0.046168  0.562761  0.050505  0.000000

5   0.060758  0.583044  0.060606  0.583044

6   0.118274  1.000000  0.121212  0.000000

7   0.125385  1.000000  0.121212  0.000000

8   0.140418  1.000000  0.141414  1.000000

9   0.153699  1.000000  0.151515  0.000000

10  0.186998  0.293743  0.191919  0.000000

11  0.215375  0.112288  0.212121  0.000000

12  0.217875  0.260883  0.222222  0.000000

13  0.250591  0.325953  0.252525  0.000000

14  0.262788  0.084916  0.262626  0.084916

15  0.287382  0.104910  0.282828  0.000000

16  0.325902  0.088418  0.323232  0.000000

17  0.377885  0.312025  0.373737  0.000000

18  0.473086  0.068632  0.474747  0.000000

19  0.485449  0.059624  0.484848  0.059624

20  0.557334  0.734376  0.555556  0.000000

21  0.572133  0.709392  0.575758  0.000000

22  0.610553  0.840687  0.606061  0.000000

23  0.626902  0.737930  0.626263  0.737930

24  0.630276  0.084787  0.626263  0.000000

25  0.637779  0.091535  0.636364  0.000000

26  0.717553  0.074411  0.717172  0.074411

27  0.742187  0.092770  0.737374  0.000000

28  0.757873  0.532881  0.757576  0.532881

29  0.780933  0.528202  0.777778  0.000000

30  0.836708  0.422615  0.838384  0.000000

31  0.920814  0.359896  0.919192  0.000000

32  0.938639  0.355241  0.939394  0.355241

33  0.954564  0.280989  0.959596  0.000000

34  0.978567  0.649749  0.979798  0.000000

35  0.995067  0.769272  1.000000  0.000000

输出图:

https://img1.sycdn.imooc.com/654c822a0001dc2a03160236.jpg

查看完整回答
反对 回复 2023-11-09
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

这看起来不错。


是的,您正在覆盖每个 .但是您还为每个 xa 添加了 tmp。我不太清楚你的x是什么。但是尝试:i


fill = [] 

for i in dp.index:

    tmp = 0

    for xa in x:

        if abs(dp.xlist[i]-xa)<0.001:

            tmp = dp.ylist[i]

    fill.append(tmp)


查看完整回答
反对 回复 2023-11-09
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信