如何使用颜色图加速 plt.scatter()?
How to speed up plt.scatter() with colormap?
我想绘制坐标(后面是 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()应该是(不要有白点和黑点):
将内部列表作为一个整体传递给情节要快得多。由于您仍想按 k
设置颜色,因此可以轻松避免 i
循环。假设 i
的维度不可忽略,这应该会大大加快这个过程。
colors = cm.rainbow(np.linspace(0, 1, 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, 1, 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)
尝试使用 pandas 将二维 data/colors 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, 0.0, 1.0, 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.8053809193888326, 0.89...
7 151 39 [0.19803921568627447, 0.8896040127307095, 0.85...
... ... ... ...
我想绘制坐标(后面是 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()应该是(不要有白点和黑点):
将内部列表作为一个整体传递给情节要快得多。由于您仍想按 k
设置颜色,因此可以轻松避免 i
循环。假设 i
的维度不可忽略,这应该会大大加快这个过程。
colors = cm.rainbow(np.linspace(0, 1, 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, 1, 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)
尝试使用 pandas 将二维 data/colors 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, 0.0, 1.0, 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.8053809193888326, 0.89...
7 151 39 [0.19803921568627447, 0.8896040127307095, 0.85...
... ... ... ...