YPO*_*POC 2 python matplotlib dataframe pandas imshow
我有一个 pandas DataFrame,["x", "y", "r", "g", "b"]其中 x 和 y 表示像素的坐标,r、g、b 表示其 RGB 值。这些行包含像素网格的每个坐标的条目并且是唯一的。如何使用 matplotlibs 显示此 DataFrame imshow()?这需要将数据重塑为 shape 的数组(M, N, 3)。
我通常的使用方法plt.imshow(df.pivot(columns="x", index="y", values="i"), interpolation="nearest")仅适用于灰度图像。放置["r", "g", "b"]为值参数会生成一个以 MultiIndex 作为列的 DataFrame。但是我无法将其转换为正确的图像。简单地调用.reshape(M, N, 3)就会产生错误的图像。
我也有创建一个新列的想法,df["rgb"] = list(zip(df.r, df.g, df.b))但是我不确定如何将生成的元组转换为 ndarray 的新轴。
有一种简单的方法可以做到这一点。首先,使用 来确保 DataFrame 按 x 和 y 值排序df = df.sort_values(by=['x', 'y'])。
接下来,通过调用从 DataFrame 中仅选择 r、g 和 b 的三列df[['r', 'g', 'b']]。您可以通过调用 将值转换为 numpy 数组df[['r', 'g', 'b']].values,这将返回 shape 的数组(M*N, 3),假设M和N是图像的宽度和高度。现在,将该数组重塑为形状(M, N, 3),就完成了。
df = df.sort_values(by=['x', 'y'])
values = df[['r', 'g', 'b']].values
image = values.reshape(df['x'].max() + 1 , df['y'].max() + 1, 3)
Run Code Online (Sandbox Code Playgroud)
我在这里假设 DataFrame 中的 x 和 y 值从 0 开始,因此我为维度添加 1。如果您的 x 和 y 值从 1 开始,则可以像这样完成重塑(df['x'].max(), df['y'].max(), 3)。
根据您对图像的 x 和 y 维度的考虑,您最终可能需要转置数组。