我正在导入2-D矩阵数据,以对5年的年度数据集进行多年气候时间序列测试。我创建了一个for循环,以按年将2D矩阵数据导入一系列5个单独的大小(1500、3600)数组中。我将矩阵时间序列数据附加到单个组合(5、1500、3600)数组中,每年都是数组中的一个维度。然后,我运行np.mean和np.std来创建(1500,3600)矩阵,计算每个矩阵点的5年平均值和stddev数据。代码如下。测试时这些数字看起来正确无误,但我想知道..
有更快的方法吗?我最终将需要在18个时间段内对每日数据运行这种类型的分析,这将在(6570,1500,3600)阵列上构建和运行。有什么建议么?我对Python相当陌生,但仍然找到了自己的方法。
StartYear=2009
EndYear=2014
for x in range(StartYear, EndYear):
name = "/dir/climate_variable" + str(x) + ".gz"
Q_WBM = rg.grid(name)
Q_WBM.Load()
q_wbm = Q_WBM.Data # .flatten()
q_wbm[np.isnan(q_wbm)] = 0
if x == StartYear:
QTS_array = q_wbm
else:
QTS_array = np.append(QTS_array, q_wbm, axis=0)
DischargeMEAN = np.mean(QTS_array, axis=0)
DischargeSTD = np.std(QTS_array, axis=0)
答案 0 :(得分:0)
与list.append
摊销O(1)numpy.append
几乎是O(n)一样,这意味着您的循环是O(n ^ 2),对于您解决所有问题都没有意思
最重要的是,6570 x 1500 x 3600 x itemsize
实际上很大,除非您有很多,否则它们就不会放入内存中。
如果您想要的只是平均值和标准差,则可以通过即时汇总来避免这两个问题。您可以将代码结尾替换为
if x == StartYear:
mom1 = q_wbm
mom2 = q_wbm**2
else:
mom1 += q_wbm
mom2 += q_wbm**2
DischargeMEAN = mom1 / n
DischargeSTD = np.sqrt(mom2 / n - DischargeMEAN**2)