调用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因无整数大小限制则不会出现此问题。
- 修复方案:
- 显式将元数据中的尺寸参数转为Python 2长整数(加
L后缀):metadata = { "samples": 1024L, "lines": 1024L, "bands": 256L, # 其他必要元数据... } spectral.envi.create_image("new_output.hdr", metadata, dtype=np.float32, force=True) - 升级numpy到Python 2.7支持的最高稳定版本(1.16.6),该版本修复了大量旧版的整数溢出问题,同时与spectral 0.23.1兼容性更好。
- 显式将元数据中的尺寸参数转为Python 2长整数(加
环境优化建议
如果ArcMap允许,优先考虑:
- 升级ArcGIS到Pro版本,使用其自带的Python 3环境,彻底避开Python 2的整数限制与旧库兼容性问题;
- 若必须保留Python 2.7环境,仅升级numpy至1.16.6,可解决绝大多数此类版本兼容问题。
内容的提问来源于stack exchange,提问作者Manuel Popp
相关产品推荐
相关产品推荐

