微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用颜色图加速 plt.scatter()?

如何解决如何使用颜色图加速 plt.scatter()?

我想绘制坐标(后跟 x0y0

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 等?

这是x0y0的一些信息。

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() 应该是(不要有白点和黑点):

enter image description here

解决方法

尝试使用 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。