gpt4 book ai didi

python - 在Python中将标量映射到颜色的快速方法

转载 作者:行者123 更新时间:2023-12-01 02:05:07 24 4
gpt4 key购买 nike

我正在寻找一种在 python 中将标量映射到十六进制颜色的快速方法:

import matplotlib
import matplotlib.cm as cm
import matplotlib.colors as mcol

np.random.seed(0)
df = pd.DataFrame(np.random.rand(20000,1))
df.head()

0
0 0.548814
1 0.715189
2 0.602763
3 0.544883
4 0.423655

我只有 20 种颜色,所以我想知道 matplotlib 是否是最好的解决方案,或者一个简单的查找表会更好。

colors = ["#084594", "#0F529E", "#1760A8", "#1F6EB3", "#2979B9", "#3484BE", "#3E8EC4",
"#4A97C9", "#57A0CE", "#64A9D3", "#73B2D7", "#83BBDB", "#93C4DE", "#A2CBE2",
"#AED1E6", "#BBD6EB", "#C9DCEF", "#DBE8F4", "#EDF3F9", "#FFFFFF"]
values = df[0].values

@profile
def apply_method(): # 6.9 sec
cm1 = mcol.ListedColormap(colors)
norm = matplotlib.colors.Normalize(vmin=np.min(values), vmax=np.max(values), clip=True)
mapper = cm.ScalarMappable(norm=norm, cmap=cm1)

return df[0].apply(lambda row: mcol.to_hex(mapper.to_rgba(row)))

%time apply_method()

从探查器中我发现 to_rgba() 是最昂贵的方法(仅 20.000 个值需要 6.5 秒)。

所以我正在寻找一种绕过 to_rgba() 方法的方法。有没有办法从 cm.ScalarMappable 获取颜色范围?然后查找正确的十六进制颜色?

最佳答案

问题代码中最昂贵的方法不是 to_rgba() 而是 DataFrame.apply 因为它将函数单独应用于每一行。

我对此问题的回答中给出了使用 matplotlib 颜色图的不同方法之间的比较:How do I map df column values to hex color in one go?

本质是使用查找表 (LUT) 确实要快得多(在那边调查的案例中快了 400 倍)。

但是请注意,在本问题的情况下,根本不需要使用 matplotlib。由于您已经有了十六进制格式的可能颜色列表,因此绝对不需要使用 matplotlib 并将十六进制颜色转换为颜色图,然后再转换回十六进制颜色。

直接使用颜色列表作为查找表 (LUT) 会更快。获取包含 10000 个条目的数据帧(以使其与其他答案的时间可比较),此问题的代码需要 2.7 秒。

以下代码需要 380 µs。这是 7000 改进的一个因素。
与使用 matplotlib 的最佳方法(从链接问题的答案中得到的 7.7 毫秒)相比,它仍然好 20 倍。

import numpy as np; np.random.seed(0)
import pandas as pd

def create_df(n=10000):
return pd.DataFrame(np.random.rand(n,1), columns=['some_value'])

def apply(df):
colors = ["#084594", "#0F529E", "#1760A8", "#1F6EB3", "#2979B9", "#3484BE", "#3E8EC4",
"#4A97C9", "#57A0CE", "#64A9D3", "#73B2D7", "#83BBDB", "#93C4DE", "#A2CBE2",
"#AED1E6", "#BBD6EB", "#C9DCEF", "#DBE8F4", "#EDF3F9", "#FFFFFF"]
colors = np.array(colors)
v = df['some_value'].values
v = ((v-v.min())/(v.max()-v.min())*(len(colors)-1)).astype(np.int16)
return pd.Series(colors[v])

df = create_df()
%timeit apply(df)

# 376 µs

关于python - 在Python中将标量映射到颜色的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49156484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com