使用Python计算相同大小的不同数组中对应值的总和

问题描述 投票:0回答:1

我对Python相当陌生,所以很可能我的问题已经在网上被问过,但是当我发现似乎相关的东西时,我并不总是知道如何在我的代码中使用它们(特别是如果它是一个函数)定义),所以如果有任何冗余,我深表歉意。

我使用哥白尼网站 (https://marine.copernicus.eu/) 的每日温度数据。

如果我想要几年内每个月每天的数据,由于 netCDF 文件太大,我想做的是访问数据而不下载数据,以便我可以使用它。

数据以数组的形式表示一年中一个月中的第一天。
我想对一年中每个月的每一天的所有数组的值求和。

为了让事情更清楚,这里有一个例子:

简化数组:

array1([1,4,3,9]
       [7,5,2,3])

array2([3,8,6,1]
       [6,4,7,2])

#... etc until day 28,29,30 or 31

我想要的结果:

array1 + array 2 => ([1+3,4+8,3+6,9+1]
                     [7+6,5+4,2+7,3+2])


array1 + array 2 => ([4,12,9,10]
                     [13,9,9,5])

我首先尝试在没有循环的情况下使用数据 2 天,结果成功了。

我的代码:

import os
import xarray as xr
import numpy as np
import netCDF4 as nc
import copernicusmarine

# Access the data
DS = copernicusmarine.open_dataset(dataset_id="cmems_mod_glo_phy_my_0.083deg_P1D-m")

# Get only thetao (temperature) variable for 1 day
subset = DS[['thetao']].sel(time = slice("2014-01-01", "2014-01-01"))

# Obtain only data of a certain depth
target_depth = 0         #surface
subset_T = subset.thetao.isel(depth=target_depth)

# To view my data in array
thetao_depth0 = subset_T.data
thetao_depth0

# Same thing for next day of the same month and year
subset2 = DS[['thetao']].sel(time = slice("2014-01-02", "2014-01-02"))

subset_T2 = subset2.thetao.isel(depth=target_depth)

thetao_depth0_2 = subset_T2.data
thetao_depth0_2

# The sum of my arrays
days_sum = thetao_depth0 + thetao_depth0_2
days_sum

我的 thetao_depth0 数组如下所示:

2014 年 1 月 1 日:

array([[[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [-1.70870081, -1.70870081, -1.70870081, ..., -1.70870081,
         -1.70870081, -1.70870081],
        [-1.71016569, -1.71016569, -1.71016569, ..., -1.71016569,
         -1.71016569, -1.71016569],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan]]])

2014 年 2 月 1 日:

array([[[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [-1.70870081, -1.70870081, -1.70870081, ..., -1.70870081,
         -1.70870081, -1.70870081],
        [-1.71016569, -1.71016569, -1.71016569, ..., -1.71016569,
         -1.71016569, -1.71016569],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan]]])

我得到了 days_sum :

array([[[        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan],
        ...,
        [-3.41740161, -3.41740161, -3.41740161, ..., -3.41740161,
         -3.41740161, -3.41740161],
        [-3.42033139, -3.42033139, -3.42033139, ..., -3.42033139,
         -3.42033139, -3.42033139],
        [        nan,         nan,         nan, ...,         nan,
                 nan,         nan]]])

现在事情变得复杂了。
我想创建一个循环,对一年中每个月的每一天(例如从 01/01/2014 到 31/01/2014)的所有数组执行相同的操作。

到目前为止我已经做到了:

day = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
month = ['01']
year = ['2014']

DS = copernicusmarine.open_dataset(dataset_id="cmems_mod_glo_phy_my_0.083deg_P1D-m")

for y in year:
    for m in month:
        for d in day:
            start_date="%s"%y+"-%s"%m+"-%s"%d
            end_date=start_date
            subset_thetao = DS[['thetao']].sel(time = slice(start_date, end_date))
            target_depth = 0 
            subset_depth = subset_thetao.thetao.isel(depth=target_depth)
            thetao_depth0 = subset_depth.data

但是我在添加每轮循环的数组时遇到困难。

我第一次尝试使用

np.sum
,但要么它不是为我想做的事情而设计的,要么我做错了,特别是当涉及到将数组与总和存储在变量中时。
我在 for 循环之前添加了
empty_array = np.array([])
,但我不知道循环中下一步要做什么。

这是我第一次用python处理数组,所以也许我做错了。

最后,我想做的是对一个月内不同数组的值进行平均。

每月 3 天的简化示例:

array1([1,4,3,9]
       [7,5,2,3])

array2([3,8,6,1]
       [6,4,7,2])

array3([3,2,6,1]
       [1,4,5,2])

获取:

array([(1+3+3)/3,(4+8+2)/3,...etc]
       [...etc])

array([2.3,4.6,5,3.6]
       [4.6,4.3,4.6,2.3])
python arrays sum average netcdf4
1个回答
0
投票

不确定,但尝试一次

target_depth = 0

result = []

for y in year:
    for m in month:
        for d in day:
            start_date="%s"%y+"-%s"%m+"-%s"%d
            end_date=start_date
            subset_thetao = DS[['thetao']].sel(time = slice(start_date, end_date)) 
            subset_depth = subset_thetao.thetao.isel(depth=target_depth)
            thetao_depth0 = subset_depth.data
            result = result + thetao_depth0

print(result)
© www.soinside.com 2019 - 2024. All rights reserved.