Numpy 3D-массив (данные NetCDF), нарезающий один и тот же элемент - самый быстрый способ - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно разрезать тот же элемент в массиве 3D numpy (фактически замаскированный массив, но работает так же). Я обычно делаю это с итерациями - однако текущие данные настолько огромны, что необходимо повторить процесс для тысяч наборов данных - это займет недели (грубая оценка). Каков самый быстрый способ разрезать 3D-массив без цикла по всем 2D-массивам?

В этом простом примере мне нужно разрезать [1, 0] элемент в каждом 2D-массиве, который равен 3 во всех 2D-массивах, и сохранить их в массиве result.

Пример NetCDF (элемент среза [500, 400])

import netCDF4

url = "http://eip.ceh.ac.uk/thredds/dodsC/public-chess/PET/aggregation/PETAggregation.ncml"
dataset = netCDF4.Dataset(url)

result = dataset.variables['pet'][:, 500, 400]

myarray ЗАМЕНЯЕТСЯ НА ВЫШЕ

myarray = np.array([
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
])

result = []
for i in myarray:
    result.append(i[1][0])

результат [3, 3, 3, 3]

РЕДАКТИРОВАТЬ FirefoxMetzger предложил просто нарезать его с помощью result = myarray[:, 1, 0]. Однако я получаю следующее сообщение об ошибке:

RuntimeError: NetCDF: ошибка сервера DAP

1 Ответ

1 голос
/ 03 августа 2020

Минимальный пример numpy, который вы предоставили, можно эффективно нарезать с помощью стандартных механизмов нарезки:

myarray = np.array([
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
])

result = myarray[:, 1, 0]

NetCFD, похоже, исходит из того, что результирующий фрагмент слишком велик для возврата с сервера, что вызывает cra sh. Согласно вашему комментарию, решение здесь состоит в том, чтобы запрашивать сервер по частям и агрегировать результаты локально.

...