问题描述
我想绘制坐标(后跟 x0
和 y0
)
colors = cm.rainbow(np.linspace(0,1,len(x0)))
for k in np.arange(len(x0)):
for i in range(len(x0[k])):
plt.scatter(x0[k][i],y0[k][i],color=colors[k],s = 2)
这个循环大约工作 50000-60000 次。
但完成2小时需要时间。 我在我的 macbook air m1 上运行这个脚本。
我认为运行这个脚本很慢。
您是否有任何解决方案来加速此代码或其他库来分散坐标,例如。 ggplot
等?
这是x0
和y0
的一些信息。
for i in range(10000,10021):
print(f'{x0[i]} {y0[i]}')
-----------------------------------
Result :
[145.5,146] [39.5,39]
[146.5] [39.5]
[147] [39]
[147.5] [39.5]
[148.5] [39.5]
[149.5] [39.5]
[150,150.5] [39,39.5]
[151] [39]
[151.5] [39.5]
[152.5] [39.5]
[153] [39]
[153.5,154] [39.5,39]
[154.5] [39.5]
[155,155.5] [39,39.5]
[156] [39]
[156.5] [39.5]
[157] [39]
[157.5] [39.5]
[158.5] [39.5]
[159] [39]
[159.5] [39.5]
plt.show() 应该是(不要有白点和黑点):
解决方法
尝试使用 Pandas 将 2D 数据/颜色explode()
转换为长格式向量。然后,您可以使用对 scatter()
的单个调用替换循环:
import pandas as pd
df = pd.DataFrame({'x0': x0,'color': cm.rainbow(np.linspace(0,1,len(x0))).tolist()})
df = df.explode('x0')
df['y0'] = pd.Series(y0).explode()
plt.scatter(df.x0,df.y0,color=df.color,s=2)
长格式数据框看起来像这样:
x0 y0 color
0 145.5 39.5 [0.5,0.0,1.0,1.0]
0 146 39 [0.5,1.0]
1 146.5 39.5 [0.40588235294117647,0.1473016980546375,0.99...
2 147 39 [0.303921568627451,0.30315267411304353,0.988...
3 147.5 39.5 [0.2019607843137255,0.45124405704532283,0.97...
4 148.5 39.5 [0.09999999999999998,0.5877852522924731,0.95...
5 149.5 39.5 [0.0019607843137254832,0.7092813076058534,0....
6 150 39 [0.09607843137254901,0.8053809193888326,0.89...
6 150.5 39.5 [0.09607843137254901,0.89...
7 151 39 [0.19803921568627447,0.8896040127307095,0.85...
... ... ... ...
,
将内部列表作为一个整体传递给情节要快得多。由于您仍然希望为每个 k
设置颜色,因此您可以轻松避免 i
循环。假设 i
的维度不可忽略,这应该会大大加快进程。
colors = cm.rainbow(np.linspace(0,len(x0)))
for k in np.arange(len(x0)):
plt.scatter(x0[k],y0[k],color=colors[k],s = 2)
编辑:由于 k
的维度远高于 i
,因此在之前切换维度会进一步减少分散的数量。
import pandas as pd
#...
colors = cm.rainbow(np.linspace(0,len(x0)))
dfx = pd.DataFrame(x0).T
dfy = pd.DataFrame(y0).T
for i in np.arange(len(x0)):
plt.scatter(dfx[i],dfy[i],color=colors[i],s = 2)