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

调用SPy的.open_memmap()时出现"Axes don't match array"错误排查

问题分析与解决方案

核心定位:版本组合兼容性问题

你的问题根源在于Python 2.7.10 + numpy 1.9.2 + spectral 0.23.1的版本组合存在兼容性缺陷,再加上ArcMap自带Python环境的封闭性,导致特定方法触发错误。以下是针对性解决思路:

1. img.open_memmap(writable=True) 触发 ValueError: axes don't match array

  • 原因:spectral 0.23.1在处理BSQ格式的可写memmap时,未适配numpy 1.9.x的数组轴校验逻辑,旧版numpy对memmap的形状匹配规则更严格,导致轴顺序校验失败。
  • 临时修复方案:
    跳过SPy内置的可写memmap方法,手动创建匹配BSQ格式的可写memmap对象:
    import spectral
    import numpy as np
    
    # 先读取图像元数据与只读memmap
    img = spectral.open_image("your_data.hdr")
    readonly_mmap = img.open_memmap()
    
    # 手动创建可写memmap,严格匹配BSQ的轴顺序(行、列、波段)
    writable_mmap = np.memmap(
        img.filename,
        dtype=img.dtype,
        mode="r+",
        shape=img.shape
    )
    

2. spectral.envi.create_image() 触发 OverflowError

  • 原因:Python 2.7的整数存在大小限制,numpy 1.9.2处理大尺寸图像元数据时易触发整数溢出;而spectral 0.23.1在Python 2环境下未针对该问题做兼容处理,Python 3因无整数大小限制则不会出现此问题。
  • 修复方案:
    1. 显式将元数据中的尺寸参数转为Python 2长整数(加L后缀):
      metadata = {
          "samples": 1024L,
          "lines": 1024L,
          "bands": 256L,
          # 其他必要元数据...
      }
      spectral.envi.create_image("new_output.hdr", metadata, dtype=np.float32, force=True)
      
    2. 升级numpy到Python 2.7支持的最高稳定版本(1.16.6),该版本修复了大量旧版的整数溢出问题,同时与spectral 0.23.1兼容性更好。

环境优化建议

如果ArcMap允许,优先考虑:

  • 升级ArcGIS到Pro版本,使用其自带的Python 3环境,彻底避开Python 2的整数限制与旧库兼容性问题;
  • 若必须保留Python 2.7环境,仅升级numpy至1.16.6,可解决绝大多数此类版本兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:01:24