首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从32 * 32列到(32 * 16)×32行,将数据帧/数组进行整形和转换

从32 * 32列到(32 * 16)×32行,将数据帧/数组进行整形和转换
EN

Stack Overflow用户
提问于 2022-03-27 22:05:43
回答 1查看 282关注 0票数 0

我有16张32x32px图片的灰度图像数据,存储在熊猫的数据中。每个数据行表示一个图像的序列化像素数据,因此dataframe有1024列。

我想要重塑数据,不仅恢复原来的图像大小,而且串联所有重塑的图像串联(水平)。

因此,第一行将如下所示:前32列: image1 -第1行像素,第二32列:图像2-1行像素,.

第二行将如下所示:前32列: image1 -第2行像素,第二32列:图像2-2行像素,.

因此,基本上,我想把我的数据从(32 * 32)的16修改到(32 * 16)的32。我想使用这些数据创建一个图像与PIL之后。

有什么优雅的方法吗?我现在有点迷茫,因为我对熊猫和Python的使用还很陌生。我不期望有一个完整的答案,但如果你至少能把我推向正确的方向,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-27 23:07:21

这里有三个不同的函数,第一个使用Pandas方法(堆栈)。第二种方法使用常规python列表,逐行构建结果。最后一张用的是矮胖的整形。

numpy整形方法的效率是其他方法的两倍,几乎所有的计算时间实际上都用于将DataFrame转换为numpy数组格式,然后返回到熊猫。

如果您想使用代码,这里是我为此使用的一个链接到笔记本

代码语言:javascript
复制
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)))
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71640670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档