Как сделать несколько растров с помощью Xarray? - PullRequest
0 голосов
/ 16 января 2020

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

Мой полосы имеют следующую информацию (игнорируя атрибуты для ясности, я могу добавить ее при необходимости):

>>> precds

<xarray.Dataset>
Dimensions:    (bnds: 2, lat: 360, lon: 720, time: 1827)
Coordinates:
  * lon        (lon) float32 -179.75 -179.25 -178.75 ... 178.75 179.25 179.75
  * lat        (lat) float32 -89.75 -89.25 -88.75 -88.25 ... 88.75 89.25 89.75
  * time       (time) datetime64[ns] 2016-01-01T12:00:00 ... 2020-12-31T12:00:00
Dimensions without coordinates: bnds
Data variables:
    time_bnds  (time, bnds) datetime64[ns] dask.array<chunksize=(10, 2), meta=np.ndarray>
    prAdjust   (time, lat, lon) float32 dask.array<chunksize=(10, 360, 720), meta=np.ndarray>
>>> wsxr

<xarray.DataArray (band: 1, y: 2160, x: 4320)>
[9331200 values with dtype=float32]
Coordinates:
  * band     (band) int64 1
  * y        (y) float64 89.96 89.87 89.79 89.71 ... -89.71 -89.79 -89.88 -89.96
  * x        (x) float64 -180.0 -179.9 -179.8 -179.7 ... 179.7 179.8 179.9 180.0
>>> tempds

<xarray.Dataset>
Dimensions:    (bnds: 2, lat: 360, lon: 720, time: 1827)
Coordinates:
  * lon        (lon) float32 -179.75 -179.25 -178.75 ... 178.75 179.25 179.75
  * lat        (lat) float32 -89.75 -89.25 -88.75 -88.25 ... 88.75 89.25 89.75
  * time       (time) datetime64[ns] 2016-01-01T12:00:00 ... 2020-12-31T12:00:00
Dimensions without coordinates: bnds
Data variables:
    time_bnds  (time, bnds) datetime64[ns] dask.array<chunksize=(10, 2), meta=np.ndarray>
    tasAdjust  (time, lat, lon) float32 dask.array<chunksize=(10, 360, 720), meta=np.ndarray>
    height     float64 ...

Здесь precds и tempds могут успешно размножаться, но я могу кажется, что умножить tempds и wsxr или precds и wsxr без какой-либо формы ошибки.

Вот что я попробовал:

>>> multiplied = precds_var1 * cotton_dask500_ds
>>> multiplied.to_netcdf('multiplied.nc')

Error:
MemoryError: Unable to allocate array with shape (1827, 360, 720, 1, 2160, 500) and data type float32

Это странно, потому что мы используем систему, на которой установлено 256 ГБ ОЗУ, и даже после попытки это или используя только одну группу, сообщение об ошибке не изменилось.

Затем, думая, что это может быть из-за разных имен, мы изменили названия групп, но это тоже не сработало. Попытка убедиться, что они имеют одинаковые типы (т. Е. float32 и float64 все еще должны работать правильно?)

Мы также попытались применить функцию squeeze, чтобы уменьшить общее количество количество измерений (может потребоваться проверить это, потому что мой коллега работал над этим, а не я), но это сообщение об ошибке, которое выскочило для меня:

>>> precipitation_slice_squeeze = precipitation_slice.squeeze()
>>> precipitation_slice_squeeze

<xarray.DataArray 'prAdjust' (lat: 360, lon: 720)>
dask.array<getitem, shape=(360, 720), dtype=float32, chunksize=(360, 720), chunktype=numpy.ndarray>
Coordinates:
  * lon      (lon) float32 -179.75 -179.25 -178.75 ... 178.75 179.25 179.75
  * lat      (lat) float32 -89.75 -89.25 -88.75 -88.25 ... 88.75 89.25 89.75
    time     datetime64[ns] 2019-01-01T12:00:00

>>> precipitation_slice_squeeze * wsxr_renamed_squeeze

ValueError: zero-size array to reduction operation minimum which has no identity

Очевидно, мы что-то делаем действительно очень неправильно. Мы довольно плохо знакомы с XArray и не имеем большого опыта работы с ними. Наша главная цель - выполнить растровый расчет на месте, поэтому любая помощь будет полезна!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...