我有一个数字列表如下:
lst = [1.9378076554115014, 1.2084586588892861, 1.2133096565896173,
1.2427632053442292, 1.1809971732733273, 0.91960143581348919,
1.1106310149587162, 1.1106310149587162, 1.1527004351293346,
0.87318084435885079, 1.1666132876686799, 1.1666132876686799]
Run Code Online (Sandbox Code Playgroud)
我想将这些数字转换为颜色以供显示.我想要灰度,但当我使用这些数字时,它给了我一个错误:
ValueError: to_rgba: Invalid rgba arg "1.35252299785"
to_rgb: Invalid rgb arg "1.35252299785"
gray (string) must be in range 0-1
Run Code Online (Sandbox Code Playgroud)
...我明白是因为它超过了1.
我接下来试图将列表中的项目除以列表中的最大数字,以给出小于1的值.但是这给出了非常窄的颜色标度,几乎没有值之间的任何差异.
有什么方法可以给出一些最小和最大范围的颜色并将这些值转换为颜色?我正在使用matplotlib.
我在我的DF一列(“color_values”),还有一些数字1到10,我想这些数字转换为十六进制的色彩搭配matplotlib.cm (cm)和matplotlib.colors (mcol)。
在这里,我构建了我的托盘:
color_list = ["#084594", ...] # my colors
cm1 = mcol.ListedColormap(color_list)
cnorm = mcol.Normalize(vmin=df["color_values"].min(), vmax=df["color_values"].max())
cpick = cm.ScalarMappable(norm=cnorm, cmap=cm1)
cpick.set_array(np.array([]))
Run Code Online (Sandbox Code Playgroud)
这是需要更快的部分,因为我有数百万行:
df["color_hex"] = df.apply(
lambda row: mcol.to_hex(cpick.to_rgba(row["color_values"])), axis=1
)
Run Code Online (Sandbox Code Playgroud)
我正在插入另一列 (color_hex),它将值从 color_values 转换为十六进制颜色,但它是通过循环遍历每个单元格来实现的。
我看了看numpy.vectorize,但在他们的文档中他们说The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop。
我也看过,numpy.where但当你有一个条件要满足时,这似乎更合适,这不是我的情况。
所以我想知道还有哪些其他 numpy 操作适合于此?