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

2D图像转3D时numpy数组transpose报axes don't match array错误求助

解决transpose时的ValueError: axes don't match array错误

错误原因分析

你的代码触发这个错误主要有两个核心问题:

  1. object_images列表未填充
    循环读取帧后,你只做了保存图像的操作,完全没有把处理后的frame添加到object_images列表里。这会导致np.array(object_images)生成一个空数组,或者维度完全不符合预期的数组,后续执行transpose自然会报错。

  2. 轴索引与数组实际维度不匹配
    假设你补全了列表填充的步骤,cv2读取的彩色图像是**(height, width, 3)的三维数组,那么object_images_array的初始维度会是(num_frames, cube_height, cube_width, 3)**(4维数组)。而你执行transpose(1, 0, 2)只指定了3个轴索引,但数组本身有4个轴,轴数量不匹配,直接触发axes don't match array错误。

修复方案

根据你想要得到(cube_depth, cube_height, cube_width)的目标维度,按以下步骤调整代码:

  1. 补全列表填充逻辑
    在循环里的cv2.imwrite之后,添加一行代码把帧存入列表:

    object_images.append(frame)
    
  2. 调整数组维度与transpose参数
    分两种情况处理:

    • 如果是生成灰度3D立方体:
      在resize前把彩色帧转成灰度图,这样每个帧是2维数组,最终数组维度直接符合需求:

      # 在Resize前添加转灰度
      frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
      frame = cv2.resize(frame, (cube_width, cube_height))
      

      此时object_images_array的维度是(num_frames, cube_height, cube_width),也就是你要的(cube_depth, cube_height, cube_width),不需要执行transpose。

    • 如果要保留彩色通道(目标维度为(cube_depth, cube_height, cube_width, 3)):
      初始数组已经是这个维度,无需transpose;如果需要把通道维度移到最前面,用transpose(3, 0, 1, 2),得到(3, cube_depth, cube_height, cube_width)的数组。

    • 如果你确实需要调整轴顺序到(cube_depth, cube_height, cube_width)(比如原数组维度是(cube_height, cube_width, cube_depth)),那要确保数组是3维的前提下,用transpose(2, 0, 1)来完成轴变换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:35:23