2016-09-22 6 views
3

У меня есть несколько массивов с dims 'time', 'lat', 'lon' и некоторые только с 'lat', 'lon'. Мне часто приходится делать это для того, чтобы замаскировать зависящие от времени данные с 2d (Lat-долготу) маска:boolean indexing in xarray

x.data[:, mask.data] = np.nan 

Конечно, расчеты вещают, как ожидалось. Если y является 2d данных Lat-долгота, его значения передаются на все временные координаты х:

z = x + y 

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

x[mask] = np.nan 

Наконец, кажется, что xr.whereделает Broadcast значения маски по координатам времени как и ожидалось, но вы не можете устанавливать значения таким образом.

x_masked = x.where(mask) 

Итак, есть то, что я здесь отсутствую, что облегчает установление значений с помощью булевой маски, которая отсутствует размеры (и должно быть циркулярным)? Есть вариант я представил в верхней действительно способ сделать это (в этом случае, я мог бы также быть просто с помощью стандартных Numpy массивов ...)

ответ

3

Несколько Смежный вопрос здесь: Concise way to filter data in xarray

В настоящее время лучший подход представляет собой комбинацию .where и .fillna.

valid = date_by_items.notnull() 
positive = date_by_items > 0 
positive = positive * 2 
result = positive.fillna(0.).where(valid) 
result 

Но изменения приходят в xarray, которые сделают это более кратким - проверка репо GitHub, если вы заинтересованы

+0

Спасибо за подтверждение, и рад слышать обновления активно идет! – jmilloy

+1

Эти изменения находятся в xarray 0.8.2? – gerrit