我有16张32x32px图片的灰度图像数据,存储在熊猫的数据中。每个数据行表示一个图像的序列化像素数据,因此dataframe有1024列。
我想要重塑数据,不仅恢复原来的图像大小,而且串联所有重塑的图像串联(水平)。
因此,第一行将如下所示:前32列: image1 -第1行像素,第二32列:图像2-1行像素,.
第二行将如下所示:前32列: image1 -第2行像素,第二32列:图像2-2行像素,.
因此,基本上,我想把我的数据从(32 * 32)的16修改到(32 * 16)的32。我想使用这些数据创建一个图像与PIL之后。
有什么优雅的方法吗?我现在有点迷茫,因为我对熊猫和Python的使用还很陌生。我不期望有一个完整的答案,但如果你至少能把我推向正确的方向,那就太好了。
发布于 2022-03-27 23:07:21
这里有三个不同的函数,第一个使用Pandas方法(堆栈)。第二种方法使用常规python列表,逐行构建结果。最后一张用的是矮胖的整形。
numpy整形方法的效率是其他方法的两倍,几乎所有的计算时间实际上都用于将DataFrame转换为numpy数组格式,然后返回到熊猫。
如果您想使用代码,这里是我为此使用的一个链接到笔记本。
def stack_image_df(image_df):
"""
Performance: 100 loops, best of 5: 19 ms per loop
"""
# create a MultiIndex indicating Row and Column information for each image
row_col_index = pd.MultiIndex.from_tuples(
[(i // 32, i % 32) for i in range(0, 1024)], name=["row", "col"]
)
image_df.columns = row_col_index
image_df.index = range(1, 17)
image_df.index.name = "Image"
# Use MultiIndex to reshape data
return image_df.stack(level=1).T
def build_image_df(image_df):
"""
Performance: 10 loops, best of 5: 19.2 ms per loop
"""
image_data = image_df.values.tolist()
reshaped = []
for r_num in range(0, 32):
row = []
for image_num in range(0, 16):
# for each image
for c_num in range(0, 32):
# get the corresponding index in the raw data
# and add the pixel data to the row we're building
raw_index = r_num * 32 + c_num
pixel = image_data[image_num][raw_index]
row.append(pixel)
reshaped.append(row)
reshaped_df = pd.DataFrame(reshaped)
return reshaped_df
def reshape_image_df(image_df):
"""
Performance: 100 loops, best of 5: 9.56 ms per loop
Note: numpy methods only account for 0.82 ms of this
"""
return pd.DataFrame(
np.rot90(np.fliplr(raw_df.to_numpy().reshape(512, 32)))
)https://stackoverflow.com/questions/71640670
复制相似问题