Python处理三维NumPy数组时如何避免for循环触发size-1数组转标量错误
问题根源
- 第一个问题是你初始化的
time = []为空列表,len(time)为0,构造的u10m数组时间维度长度为0,本身不符合实际计算需求 - 第二个问题正如你推测的:
u10m[:,i,j]中的:会取该格点所有时间步的数值,累加得到的psum是和时间维度等长的一维数组,而你定义的u_zavg[i]只能存储单个标量,赋值时维度不匹配触发报错 - 你之前尝试添加
l = sum(k, axis = 0)没有效果的原因是:仅对时间维做了求和,但没有同步调整u_zavg的维度,如果是要保留时间维的话,u_zavg应该定义成np.zeros((len(time), len(lat))),而不是长度只有纬度数的一维数组
解决办法
按你常见的两种计算需求分别给出方案,优先推荐numpy内置的向量化运算,比手动写嵌套循环效率高很多:
需求1:得到每个纬度的总平均(同时对时间、经度维度取平均,每个纬度对应一个标量结果)
向量化写法(推荐)
import numpy as np # 先修正time维度,示例假设你有20个时间步,可根据实际业务修改 time = range(20) lat = range(-90, 90) lon = range(0, 180) u10m = np.random.randint(-10, 20, (len(time),len(lat),len(lon))) # 直接指定对第0维(时间)、第2维(经度)同时取平均,一步得到结果 u_zavg = u10m.mean(axis=(0, 2))
保留原循环逻辑的修改版
import numpy as np time = range(20) lat = range(-90, 90) lon = range(0, 180) u10m = np.random.randint(-10, 20, (len(time),len(lat),len(lon))) u_zavg = np.zeros(len(lat)) for i in range(len(lat)): psum = 0 for j in range(len(lon)): # 对时间维先求和再累加,保证psum是标量 psum += u10m[:,i,j].sum() # 除以经度数量的同时也要除以时间步数量 u_zavg[i] = psum/(len(lon)*len(time))
需求2:保留时间维度,得到每个时间步、每个纬度的纬向平均
# 仅对经度维度(第2维)取平均,得到的结果形状为 (时间步数量, 纬度数量) u_zavg_by_time = u10m.mean(axis=2)
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

