Python计算不同季节SIC趋势时索引错误问题求助
我正在使用Python计算1979年至2009年不同季节的海冰密集度(SIC)趋势,需要从形状为(372, 180, 360)的月度数据中提取各季节数据(372对应31年×12个月)。我尝试通过提取每年各月度数据,再将三个月组合为同一季节数组,但运行代码时出现了索引错误。
我的代码:
print sic.shape # 输出(372, 180, 360) sics=sic[90,:,:] sicm=[] for i in range(0,12): sicj=sic[i::12,:,:] sicm.append(sicj) del sicj sics[0::3,:,:]=sicm[11][:30,:,:] sics[1::3,:,:]=sicm[0][1:,:,:] sics[2::3,:,:]=sicm[1][1:,:,:]
错误信息:
IndexErrorTraceback (most recent call last)
in ()
----> 1 sics[0::3,:,:]=sicm[11][:30,:,:]
/home/charcoalp/anaconda2/envs/pyn_test/lib/python2.7/site-packages/numpy/ma/core.pyc in setitem(self, indx, value)
3299 _mask = self._mask
3300 # Set the data, then the mask
-> 3301 _data[indx] = dval
3302 _mask[indx] = mval
3303 elif hasattr(indx, 'dtype') and (indx.dtype == MaskType):
IndexError: too many indices for array
问题分析
你遇到的核心问题是数组维度不匹配:
- 代码中
sics = sic[90,:,:]提取的是单个时间步的二维数组(形状(180, 360)),但后续你试图给它赋值三维数组切片(比如sicm[11][:30,:,:]的形状是(30, 180, 360))。二维数组无法接受三维的索引操作,因此触发了too many indices for array错误。
你的整体思路(先按月份分组年度数据,再组合成季节数组)是完全可行的,只是初始化季节数组的方式出错了。
修正方案
我们需要创建一个合适维度的数组来存储季节数据,以下是具体实现(以常见的北极海冰研究季节划分为例):
步骤1:明确季节定义
- 冬季:前一年12月 + 当年1月、2月
- 春季:3、4、5月
- 夏季:6、7、8月
- 秋季:9、10、11月
步骤2:修正后的代码
import numpy as np # 假设sic是你的原始数据,形状(372, 180, 360) print(sic.shape) # 输出(372, 180, 360) # 按月份分组,每个元素对应该月的所有年度数据,形状(31, 180, 360) sicm = [] for i in range(12): sicj = sic[i::12, :, :] sicm.append(sicj) # ---------------------- # 1. 处理冬季数据(共30个冬季:1979冬 ~ 2008冬) # 冬季 = 前一年12月 + 当年1月 + 当年2月 winter_sic = np.stack([ sicm[11][:-1], # 1979-2008年的12月(共30个) sicm[0][1:], # 1980-2009年的1月(共30个) sicm[1][1:] # 1980-2009年的2月(共30个) ], axis=1) # 形状:(30, 3, 180, 360) → (季节数, 季节内月份数, 纬度, 经度) # 计算冬季平均SIC(可选) winter_mean = np.mean(winter_sic, axis=1) # 形状:(30, 180, 360) # ---------------------- # 2. 处理春季数据(共31个春季:1979春 ~ 2009春) spring_sic = np.stack([sicm[2], sicm[3], sicm[4]], axis=1) # 形状:(31, 3, 180, 360) spring_mean = np.mean(spring_sic, axis=1) # ---------------------- # 3. 处理夏季数据 summer_sic = np.stack([sicm[5], sicm[6], sicm[7]], axis=1) summer_mean = np.mean(summer_sic, axis=1) # ---------------------- # 4. 处理秋季数据 autumn_sic = np.stack([sicm[8], sicm[9], sicm[10]], axis=1) autumn_mean = np.mean(autumn_sic, axis=1)
关键说明
- 使用
np.stack可以将多个同维度的数组按指定轴组合,轻松构建包含季节内月份的四维数组。 - 如果不需要保留季节内的月份维度,直接对
axis=1求平均即可得到每个季节的平均SIC数据。 - 冬季的年份范围需要特殊处理,因为数据从1979年1月开始,所以第一个冬季对应1979年12月+1980年1-2月,最终得到30个冬季数据;而春/夏/秋可以直接取全部31年的数据。
内容的提问来源于stack exchange,提问作者Yuhang Pan

