【问题标题】:Mean and Standard deviation across multiple arrays using numpy使用 numpy 跨多个数组的均值和标准差
【发布时间】:2018-12-07 09:31:43
【问题描述】:

我正在导入二维矩阵数据,用于在 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)

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    list.append 不同的是,它的摊销 O(1) numpy.append 几乎是 O(n),这意味着你的循环是 O(n^2) 并且在你的全部问题上使用起来没有乐趣。

    最重要的是,6570 x 1500 x 3600 x itemsize 实际上非常大,除非你有很多,否则无法放入内存。

    如果您想要的只是平均值和 SD,那么您可以通过即时求和来回避这两个问题。您可以将代码的末尾替换为

        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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 2021-08-07
      • 2023-03-15
      • 2015-06-08
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      相关资源
      最近更新 更多