python - 用零填充不均匀点列表的缺失值
问题描述
我有一组点保存为数据框dp:
xlist ylist
0 0.017108 0.902494
1 0.019659 0.741981
2 0.030310 0.920884
3 0.032064 0.255826
4 0.046168 0.562761
5 0.060758 0.583044
6 0.118274 1.000000
7 0.125385 1.000000
8 0.140418 1.000000
9 0.153699 1.000000
10 0.186998 0.293743
11 0.215375 0.112288
12 0.217875 0.260883
13 0.250591 0.325953
14 0.262788 0.084916
15 0.287382 0.104910
16 0.325902 0.088418
17 0.377885 0.312025
18 0.473086 0.068632
19 0.485449 0.059624
20 0.557334 0.734376
21 0.572133 0.709392
22 0.610553 0.840687
23 0.626902 0.737930
24 0.630276 0.084787
25 0.637779 0.091535
26 0.717553 0.074411
27 0.742187 0.092770
28 0.757873 0.532881
29 0.780933 0.528202
30 0.836708 0.422615
31 0.920814 0.359896
32 0.938639 0.355241
33 0.954564 0.280989
34 0.978567 0.649749
35 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)
但我认为我正在覆盖列表“填充”,这就是它不起作用的原因,但我不知道如何解决这个问题。
有没有一种快速简单的方法来实现这一目标?
解决方案
不需要循环。您可以使用熊猫方法:
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
输出图:
推荐阅读
- css - 当文本过多时高度增长时,网格列内部输入推动上 div
- c++ - 为什么在文件中声明全局变量不包括?(c++)
- azure-cosmosdb - CosmosDB UDF 返回 5 天后的日期
- apache-camel - 找不到端点:direct://DistributeOrderXML,请检查您的类路径是否包含所需的 Camel 组件 jar
- firebase - 传递来自 firebase 集合的值以过滤来自另一个集合的文档
- angular - 数据传输错误 Angular CLI 到 Laravel(Access-Control-Allow-Origin' 标头)
- rest - JMeter:Restful API 记录
- docker - 一切正常,但仍然显示无法连接到 Docker 中 unix:///var/run/docker.sock 的 Docker 守护进程
- sql - 如何在更改列字符串之前从 SQL 表中获取所有行?
- linux - linux内核:了解jiffies diff是如何计算的