You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Pandas DataFrame渲染的numpy数组图片缩略图尺寸?

解决Pandas DataFrame中渲染NumPy数组缩略图尺寸过小的问题

我之前也碰到过一模一样的情况——明明改了缩略图尺寸、调了Pandas的显示参数,DataFrame里的小数字图像还是缩得看不清。核心问题其实出在两个地方:一是你用的8x8原数组本身像素太低,二是Jupyter Notebook的表格单元格会默认限制内容的显示空间。下面给你几个亲测有效的解决办法:

你的问题代码参考

你用来渲染数组的代码如下:

from sklearn import datasets
from PIL import Image
from IPython.display import HTML
from io import BytesIO
import base64
import matplotlib as mpl
from skimage.exposure import rescale_intensity
import numpy as np
import pandas as pd

def image_formatter(arr):
    cm = mpl.cm.get_cmap("viridis")
    i = rescale_intensity(cm(arr)[...,:3], out_range=(0,255)).astype(np.uint8)
    im = Image.fromarray(i)
    im.thumbnail((500, 500), Image.LANCZOS)
    with BytesIO() as buffer:
        im.save(buffer, "jpeg")
        enc = base64.b64encode(buffer.getvalue()).decode()
    return f'<img src="data:image/jpeg;base64,{enc}">'

def display_profile(d):
    with pd.option_context("display.max_colwidth", 1000):
        return HTML(d.to_html(formatters=dict(img=image_formatter), escape=False))

digits = [np.reshape(x, (8,8)) for x in datasets.load_digits()["data"]][:5]
testdf = pd.DataFrame({"a": [1,2,3,4,5], "b": [10,20,30,40,50], "img": digits})
display_profile(testdf)

具体解决方法

1. 先放大原数组,再生成图片(最关键的一步)

你的原数组是8x8的极小矩阵,直接转成图片后,thumbnail()只能缩小不能放大——它的作用是把大图片缩到指定尺寸以内,对小图片完全没用。所以得先把数组放大,再生成图片:

# 别忘了导入skimage的resize工具
from skimage.transform import resize

def image_formatter(arr):
    cm = mpl.cm.get_cmap("viridis")
    # 先把8x8的数组放大到80x80(可以根据需要调整)
    arr_resized = resize(arr, (80, 80), anti_aliasing=True)
    i = rescale_intensity(cm(arr_resized)[...,:3], out_range=(0,255)).astype(np.uint8)
    im = Image.fromarray(i)
    # 这里用resize强制放大到你想要的尺寸,比如200x200
    im = im.resize((200, 200), Image.LANCZOS)
    with BytesIO() as buffer:
        im.save(buffer, "jpeg")
        enc = base64.b64encode(buffer.getvalue()).decode()
    # 给img标签加style强制设置宽高,避免被表格单元格限制
    return f'<img src="data:image/jpeg;base64,{enc}" style="width:200px; height:200px;"/>'

2. 绕过DataFrame单元格限制,自定义HTML表格

如果还是觉得表格单元格把图片挤得太小,可以完全自己构建HTML布局,不依赖Pandas的to_html:

def display_profile_custom(d):
    # 自定义表格样式,避免默认的紧凑布局
    html = '<table style="border-collapse: collapse; font-size:16px;">'
    # 构建表头
    html += '<tr>'
    for col in d.columns:
        html += f'<th style="border:1px solid #ddd; padding:12px; background:#f5f5f5;">{col}</th>'
    html += '</tr>'
    # 逐行生成内容
    for _, row in d.iterrows():
        html += '<tr>'
        html += f'<td style="border:1px solid #ddd; padding:12px;">{row["a"]}</td>'
        html += f'<td style="border:1px solid #ddd; padding:12px;">{row["b"]}</td>'
        # 处理图片部分
        cm = mpl.cm.get_cmap("viridis")
        arr_resized = resize(row["img"], (80, 80), anti_aliasing=True)
        i = rescale_intensity(cm(arr_resized)[...,:3], out_range=(0,255)).astype(np.uint8)
        im = Image.fromarray(i).resize((200,200), Image.LANCZOS)
        with BytesIO() as buffer:
            im.save(buffer, "jpeg")
            enc = base64.b64encode(buffer.getvalue()).decode()
        html += f'<td style="border:1px solid #ddd; padding:12px;"><img src="data:image/jpeg;base64,{enc}" style="width:200px; height:200px;"/></td>'
        html += '</tr>'
    html += '</table>'
    return HTML(html)

# 调用这个自定义函数
display_profile_custom(testdf)

3. 全局修改Jupyter的表格样式(可选)

如果想让所有DataFrame里的图片都默认显示大尺寸,可以在Notebook里运行这段代码,覆盖默认的CSS样式:

from IPython.display import display, HTML

display(HTML('''
<style>
    /* 调整表格中图片的默认大小 */
    .dataframe img {
        width: 200px !important;
        height: 200px !important;
    }
    /* 增加表格单元格的内边距,避免图片挤在一起 */
    .dataframe td, .dataframe th {
        padding: 12px !important;
    }
</style>
'''))

几个关键提醒

  • thumbnail()和resize()的区别:前者只缩小不放大,后者可以强制调整到指定尺寸,适合你的小图片场景。
  • display.max_colwidth只控制文本内容的宽度,对HTML元素(比如img)完全无效,必须用style属性或者CSS来控制图片大小。
  • 原8x8数组像素太低,直接拉伸图片会模糊,所以一定要先放大数组再生成图片,这样清晰度会好很多。

内容的提问来源于stack exchange,提问作者r0f1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:57:57