使用numpy跨多个数组的平均值和标准差

2024-06-16 09:49:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在导入2-D矩阵数据,在5年一次的数据集上进行多年气候时间序列测试。我已经创建了一个for循环,将2D矩阵数据按年份导入一系列5个不同大小的数组(15003600)。我将矩阵时间序列数据附加到一个单独的组合(515003600)数组中,其中每年都是数组中的一维。然后我运行np平均值以及np.标准创建(15003600)矩阵,计算每个矩阵点数据的5年平均值和标准偏差。代码如下。当我测试这个时,数字看起来是正确的,但是我想知道。。在

有没有更快的方法?我最终将需要在一个(6570、1500、3600)阵列上构建和运行的18个时间跨度内对每日数据运行这种类型的分析。有什么建议吗?我对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)

Tags: 数据fornp时间序列矩阵数组array
1条回答
网友
1楼 · 发布于 2024-06-16 09:49:47

list.append不同,它是摊销的O(1)numpy.append几乎是O(n),这意味着你的循环是O(n^2),用在你的整个问题上没有任何乐趣。在

除此之外,6570 x 1500 x 3600 x itemsize实际上相当大,除非你有很多这样的内存,否则它无法放入内存中。在

如果你想要的是mean和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)

相关问题 更多 >