У меня есть функция, которая принимает несколько 2D-массивов и создает два новых массива той же формы. Первоначально он был написан для поддержки только массивов numpy, но был "взломан" для поддержки массивов dask, если был замечен атрибут "chunks". Пользователь, который использовал xarray DataArrays, указал, что эта функция теперь возвращает массивы dask, потому что DataArray имеет атрибут chunks.
Мне интересно, могут ли эксперты dask / xarray сказать мне, какой самый чистый способ поддержки всех 3 (4?) Типов объектов может быть без необходимости дублировать код для каждого типа (массив numpy, массив dask, xarray с numpy, xarray с dask). Имейте в виду, что входные данные представляют собой 2D-массивы, поэтому задействованные операции маскирования не поддерживаются из коробки. Соответствующий запрос на извлечение для исправления этого - здесь. Вот что мы до сих пор пытались избежать добавления xarray и dask в качестве необходимых зависимостей:
if hasattr(az_, 'chunks') and not hasattr(az_, 'loc'):
# dask array, but not xarray
import dask.array as da
az_ = da.where(top_s > 0, az_ + np.pi, az_)
az_ = da.where(az_ < 0, az_ + 2 * np.pi, az_)
elif hasattr(az_, 'loc'):
# xarray
az_.data[top_s > 0] += np.pi
az_.data[az_.data < 0] += 2 * np.pi
else:
az_[top_s > 0] += np.pi
az_[az_ < 0] += 2 * np.pi
Редактировать: Есть ли атрибут, который является полууникальным для объектов xarray?
ХОРОШО. Возможно, вы захотите избежать ненужной зависимости. пытаться:
ХОРОШО. Возможно, вы захотите избежать ненужной зависимости.
Я часто определяю переменную has_dask
try:
import dask.array as da
has_dask = True
except ImportError:
has_dask = False
а потом
if has_dask and isinstance(az_, da.Array):
--- do some thing ---
else
--- do some other thing ----
Это то, к чему я пришел, спасибо. Кроме того, я вытащил все объекты xarray .data
, чтобы их можно было рассматривать как обычный массив dask / numpy, а затем поместил их обратно в объект xarray.
Я немного опоздал на вечеринку, но если это то, что вы делаете много, вы можете подумать о декораторе функций, который приведет ваш входной массив к ndarray (или в любом другом случае), запустите завернутый функция и, возможно, даже переверните результат в соответствии с типом ввода перед его возвратом. Это то, с чем я играл пару раз, но я все время решал, что лучше буду использовать и поддерживать объекты xarray, когда это возможно. Я некоторое время смотрел на xr-scipy, когда впервые начал играть с xarray. Вы можете найти там несколько шаблонов, которые были бы достаточно общими (или их легко можно было бы сделать так), добавляя при необходимости немного дополнительных элементов для объектов xarray.
Почему вы хотите различать их по признаку? Это немного опасно, потому что дочерний класс numpy.array может иметь атрибут
chunks
. Я думаю, чтоisinstance(az_, dask.array.Array)
более прямолинейный.