我有一个 pandas DataFrame,其中包含
["x", "y", "r", "g", "b"]
列,其中 x 和 y 表示像素的坐标,r、g、b 表示其 RGB 值。这些行包含像素网格的每个坐标的条目并且是唯一的。如何使用 matplotlibs 的 imshow()
显示此 DataFrame?这需要将数据重塑为形状为(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 的新轴。
有一种简单的方法可以做到这一点。首先,使用
df = df.sort_values(by=['x', 'y'])
确保 DataFrame 按 x 和 y 值排序。
接下来,通过调用
df[['r', 'g', 'b']]
从 DataFrame 中仅选择 r、g 和 b 的三列。您可以通过调用 df[['r', 'g', 'b']].values
将这些值转换为 numpy 数组,这将返回形状为 (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)
我在这里假设 DataFrame 中的 x 和 y 值从 0 开始,因此我为维度添加 1。如果您的 x 和 y 值从 1 开始,则可以像这样完成重塑
(df['x'].max(), df['y'].max(), 3)
。