Python Xarray DataArray: как добавить дополнительную координату в существующее измерение - PullRequest
0 голосов
/ 15 мая 2018

Я только начинаю использовать Xarray DataArray, и я не был уверен , как добавить новую ось координат в существующее измерение .Может ли кто-нибудь указать мне в правильном направлении.

Итак, у меня есть существующий массив, который выглядит следующим образом:

 demo_results = np.zeros([10, 20, 5])
 cols = ['c1', 'c2', 'c3', 'c4', 'c5']
 t = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim'))

Так что это даст мне 3-мерный массив с 5 координатами вдоль измерения 'sim'.Теперь я хотел добавить дополнительную координату к измерению 'sim' с именем 'c6', но я не был уверен, как это сделать?Я не видел никакой информации или примеров в документации.В pandas я бы просто сослался на новое измерение, например df.loc[:, 'c6] = 0, и это сработало бы.Но я пробовал что-то подобное с Xarray, например:

 t.loc['sim', 'c6'] = 0 

, но я получаю сообщение об ошибке: TypeError: invalid indexer array, does not have integer dtype: array('sim', dtype='<U3')

Я думаю, что я все еще получаю навык индексации DataArray.

1 Ответ

0 голосов
/ 16 мая 2018

Xarray использует массивы numpy / dask под капотом, поэтому автоматическое расширение не поддерживается (как в Pandas).

Если вы заранее знаете имена и количество столбцов, вы можете заранее создать полную область. Э.Г.

demo_results = np.zeros([10, 20, 6])
cols = ['c1', 'c2', 'c3', 'c4', 'c5', 'c6']
t = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim'))
t.loc[{'sim': 'c6'}] = -999.  # or whatever value you like

Обратите внимание, это не будет работать, если вы используете dask-массивы, которые не поддерживают назначение элементов.

Если вы используете dask, не можете создать полный массив раньше времени, вы всегда можете использовать xarray.concat:

demo_results = np.zeros([10, 20, 1]) - 999.
cols = ['c6']
t6 = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim'))

# concat old+new
t = xr.concat([t, t6], dim='sim')
...