使用numpy

时间:2018-12-07 00:12:54

标签: python arrays numpy

我正在导入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)

1 个答案:

答案 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)