Python写入栅格数组到文件触发ValueError问题求助
先查结果数组
tempraster的类型和内容
写入前必须确认tempraster是纯数值型数组(比如float32、int16),不能混有布尔值或者混合类型。直接跑print(tempraster.dtype)看类型,用np.unique(tempraster)检查有没有True/False这类布尔值混进去。如果计算时用了掩码(比如mask1 = (arr > 0)),要确保是给tempraster[mask1]赋值数值,不是直接把布尔掩码赋值给结果数组。排查写入参数是否合法
Rasterio写入时的nodata、transform、width、height这些参数必须是标量,不能是数组。比如你要是把某个栅格的transform属性直接传进去,先确认它是单个transform对象,不是数组;nodata要设成具体的单个值,比如np.nan或者-9999,不能传数组型的标记。改用Rioxarray写文件更省心
既然你已经在用rioxarray,直接用它的写入方法能避开很多底层参数坑:import rioxarray as rxr # src是你用来参考的原始栅格(已经用rioxarray打开的) temp_arr = rxr.DataArray(tempraster, dims=["y", "x"], coords={"x": src.x, "y": src.y}, attrs=src.attrs) temp_arr.rio.set_crs(src.rio.crs) temp_arr.rio.to_raster("hourly_temp_output.tif")这种方式会自动继承参考栅格的CRS、transform等元数据,不用手动凑参数,出错概率低很多。
清理掩码残留的布尔值
就算计算阶段没报错,也可能掩码组合后有布尔值留在结果数组里。跑np.isin(tempraster, [True, False]).any()看看有没有布尔值,如果有,根据业务逻辑替换成对应数值——比如把True换成实际温度值,False换成np.nan。强制转换数组类型
写入前强制把tempraster转成目标数值类型,比如:import numpy as np tempraster = tempraster.astype(np.float32)这能彻底避免混合类型导致的真值判断歧义问题。
内容的提问来源于stack exchange,提问作者John Polo

