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

使用PIL读取缩放图像后调用numpy.concatenate报TypeError错误的解决求助

问题分析

你遇到的错误核心原因很明确:np.concatenate是用来拼接numpy数组的,但你的faults和normal列表里装的是PIL Image对象,不是numpy数组,所以numpy没法把Image对象转成它能处理的数值类型,就抛出了类型错误。

解决方案

有两种简单的方法可以解决这个问题,核心都是把PIL Image对象转换成numpy数组:

方案1:读取图像时直接转成numpy数组

修改你最初的图像读取代码,在把图像加入列表前,先转换成numpy数组。同时推荐用os.path.join来拼接路径,适配Windows/Linux不同的路径分隔符:

from PIL import Image
import os
import numpy as np

size = (96,96)
list_of_images = []
path = "你的图像文件夹路径"  # 替换成实际路径

for filename in os.listdir(path):
    # 用os.path.join生成更安全的路径
    image_directory = os.path.join(path, filename)
    print(image_directory)
    image = Image.open(image_directory)
    image = image.resize(size)
    # 将PIL Image转换为numpy数组
    image_np = np.array(image)
    # 如果你的图像是灰度图(单通道),建议添加通道维度,避免后续拼接维度不匹配
    # image_np = np.array(image)[..., np.newaxis]
    list_of_images.append(image_np)

这样处理后,list_of_images里就全是numpy数组了,后续的切片和拼接代码可以直接正常运行。

方案2:对现有Image列表批量转换

如果不想修改读取代码,也可以在拼接前把faults和normal列表里的Image对象批量转成numpy数组:

import numpy as np

# 将PIL Image列表转换为numpy数组列表
faults_np = [np.array(img) for img in faults]
normal_np = [np.array(img) for img in normal]

# 同样,如果是灰度图,记得添加通道维度
# faults_np = [np.array(img)[..., np.newaxis] for img in faults]
# normal_np = [np.array(img)[..., np.newaxis] for img in normal]

# 现在可以正常拼接了
train_images = np.concatenate((faults_np, normal_np), axis = 0)
train_labels = np.concatenate((fault_label, normal_label), axis = 0)
为什么你的BytesIO尝试没用?

你之前把Image转成字节流的方法,得到的是PNG格式的字节数据,这依然不是numpy数组,np.concatenate无法处理这种类型的数据,所以这个思路解决不了问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:57:49