Добавление значений массива внутри словаря - PullRequest
2 голосов
/ 11 марта 2020

Я работаю с набором данных, который привязан к сетке, со временем, широтой и долготой в качестве индексов, и месячной температурой в качестве фактической переменной. Сначала я загружаю данные и извлекаю нужную переменную.

data=xr.open_dataset('E:/Riskpulse_HD/Jon climate study/adaptor.mars.internal-1583855532.1432714-8122-5-ace27afd-90c0-4a7d-b9ca-f3d5528c5ea1.nc')
temp = data['t2m'][:,0,:,:]-273

Я создаю массивы со значениями в указанных точках c. Существует одно значение для каждого месяца, начиная с 1990-01-01, затем 1991-02-01 и так далее до настоящего момента. Теперь я создаю словарь нескольких городов по всему миру в различных точках широты и долготы.

Теперь я создаю словарь для городов и десятилетий.

cities = {
 "Shanghai": {"coords": [31.25, 121.5]},
    "Singapore": {"coords": [1.25, 103.75]},
    "Shenzhen": {"coords": [22.5, 114]},
    "Ningbo-Zhoushan": {"coords": [29.75, 121.5]},
    "Guangzhou": {"coords": [23.0, 113.5]}...}


decades = {
    "1990s": {"start": dt.datetime(1990,1,1), "end": dt.datetime(1999,12,31)},
    "2000s": {"start": dt.datetime(2000,1,1), "end": dt.datetime(2009,12,31)},
    "2010s": {"start": dt.datetime(2010,1,1), "end": dt.datetime(2019,12,31)}}

Теперь я л oop и создайте новые словарные записи в виде городов ['Название города'] ['Десятилетие'] следующим образом.

for city, location in cities.items():
    data = temp.sel(latitude=location['coords'][0], longitude=location['coords'][1])
    for decade, dates in decades.items():
        cities[city][decade] = data.sel(time=(slice(dates['start'], dates['end'])))

Данные выглядят так для cities['Shanghai']['1990s'] и cities['Singapore']['1990s']:

-->array([ 5.1273193,  6.3297424, 11.221802 , 14.664612 , 19.932983 ,...)]
-->array([26.064209, 26.56131 , 27.427673, 27.856506, 28.208313, 28.161072,...)]

Где первое значение соответствует среднемесячной температуре в Шанхае в 1990-01-01, а второе - среднемесячная температура в Шанхае в 1990-02-01.

Теперь, что бы я хотел хотел бы создать простой l oop, который берет 5 городов, которые я перечислил, и складывает средние временные значения для каждого месяца в течение каждого десятилетия.

Я пробовал что-то вроде этого

for i in cities.keys():
    total=np.sum(cities[i]['1990s'])

-->total array(1272.0103, dtype=float32)

Но это просто добавляет каждую точку данных температуры вместе. Я хочу, чтобы операция добавляла каждый элемент массива, сохраняя все элементы одинаковыми в зависимости от месяца, в который они были добавлены. Например, для Шанхая и Сингапура это будет выглядеть так:

array([31.191528, 32.891052, 38.649475, 42.52112 , 48.141296,...)]

1 Ответ

1 голос
/ 11 марта 2020

В этом случае вы хотите сложить массивы с помощью np.stack() перед использованием np.sum() с axis=0:

total = np.sum(np.stack([cities[i]['1990s'] for i in cities.keys()]), axis=0)

Выход:

[31.1915283 32.8910524 38.649475  42.521118  48.141296 ]
...