Как обновить `xarray.Массив данных ` с помощью индексатора `.sel ()`?

#python #database #numpy #dataframe #python-xarray

#python #База данных #numpy #фрейм данных #python-xarray

Вопрос:

Я обнаружил, что самый простой способ визуализировать создание a N-dimensional DataArray — создать a np.ndarray , а затем заполнить значения по созданным мной координатам. Когда я попытался это сделать, я не мог понять, как обновить xr.DataArray .

Как я могу обновить xr.DataArray инициализированные мной метки, используя созданные мной метки?Мои фактические данные представляют собой гораздо более сложный набор данных, но это подводит итог тому, что я пытаюсь сделать. Я могу использовать .loc , но иногда мои ndarrays становятся огромными и сложными, когда я действительно не знаю порядок затемнения.

 # Construct DataArray
DA = xr.DataArray(np.ndarray((3,3,5)), dims=["axis_A","axis_B","axis_C"], coords={"axis_A":["A_%d"%_ for _ in range(3)],
                                                                                  "axis_B":["B_%d"%_ for _ in range(3)],
                                                                                 "axis_C":["C_%d"%_ for _ in range(5)]})
# <xarray.DataArray (axis_A: 3, axis_B: 3, axis_C: 5)>
# array([[[ 0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.]],

#        [[ 0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.]],

#        [[ 0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.]]])
# Coordinates:
#   * axis_B   (axis_B) <U3 'B_0' 'B_1' 'B_2'
#   * axis_A   (axis_A) <U3 'A_0' 'A_1' 'A_2'
#   * axis_C   (axis_C) <U3 'C_0' 'C_1' 'C_2' 'C_3' 'C_4'

# # Update? 
DA.sel(axis_A="A_1", axis_B="B_1", axis_C="C_1").values = 1
DA.max()
# # <xarray.DataArray ()>
# # array(0.0)

DA.sel(axis_A="A_1", axis_B="B_1", axis_C="C_1") = 1
# #  File "<ipython-input-17-8feb7332633f>", line 4
# #     DA.sel(axis_A="A_1", axis_B="B_1", axis_C="C_1") = 1
# #                                                         ^
# # SyntaxError: can't assign to function call
 

Ответ №1:

Это действительно неудобно из-за неудачного ограничения синтаксиса Python, заключающегося в том, что аргументы ключевых слов не поддерживаются во внутренней квадратной скобке.

Поэтому вместо этого вам нужно поместить аргументы в .sel качестве словаря вместо .loc :

 DA.loc[dict(axis_A="A_1", axis_B="B_1", axis_C="C_1")] = 1
 

Комментарии:

1. Еще раз спасибо @Stephan! Я видел этот синтаксис на xarray.pydata.org/en/stable/indexing.html но я не знал, что вы можете обновляться таким образом.

2. Я пропустил эту опцию об индексации для назначения. Я не думаю, что это где-нибудь в справке. Я мог бы добавить это

3. см. github.com/pydata/xarray/issues/2055 для обсуждения того, как мы должны исправить документы

4. Спасибо. А как насчет .sel method='nearest' возможностей? Я хотел бы изменить значение ячейки сетки, которая находится над определенной точкой широты / широты… И эта точка lat / lon, конечно, отсутствует в переменной co-ord, поэтому я получаю KeyError без method='nearest' .