Самый чистый способ поддержки массивов xarray, dask и numpy в одной функции

У меня есть функция, которая принимает несколько 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?

Почему вы хотите различать их по признаку? Это немного опасно, потому что дочерний класс numpy.array может иметь атрибут chunks. Я думаю, что isinstance(az_, dask.array.Array) более прямолинейный.

Keisuke FUJII 11.08.2018 01:03

ХОРОШО. Возможно, вы захотите избежать ненужной зависимости. пытаться:

Keisuke FUJII 11.08.2018 01:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
491
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

ХОРОШО. Возможно, вы захотите избежать ненужной зависимости. Я часто определяю переменную 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.

djhoese 13.08.2018 20:38

Я немного опоздал на вечеринку, но если это то, что вы делаете много, вы можете подумать о декораторе функций, который приведет ваш входной массив к ndarray (или в любом другом случае), запустите завернутый функция и, возможно, даже переверните результат в соответствии с типом ввода перед его возвратом. Это то, с чем я играл пару раз, но я все время решал, что лучше буду использовать и поддерживать объекты xarray, когда это возможно. Я некоторое время смотрел на xr-scipy, когда впервые начал играть с xarray. Вы можете найти там несколько шаблонов, которые были бы достаточно общими (или их легко можно было бы сделать так), добавляя при необходимости немного дополнительных элементов для объектов xarray.

Другие вопросы по теме