Как постоянно округлить значения в растровом слое, матрице или массиве, чтобы записать в новый файл, используя r studio? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь округлить либо 3-мерную матрицу, либо несколько растровых слоев, которые будут преобразованы в 3-мерную матрицу, до 2 десятичных знаков, чтобы создать новый файл netcdf, который будет занимать меньше памяти.

Использование функции округления как таковой:

newmatrix <- round(oldmatrix, 2)

только кажется, что округляет значения поверхностно для отображения. Открытие newmatrix и извлечение значений из него после добавления его в новый файл возвращает необоснованные значения из oldmatrix. И это несмотря на то, что значения, извлеченные из newmatrix перед добавлением его в новый файл, будут округлены до 2 десятичных знаков, как и должно быть. То же самое происходит, если я закругляю растровые слои перед созданием новой матрицы с ними.

Какую функцию я могу использовать для постоянного округления значений моей матрицы или растра для записи в новый округленный файл?

1 Ответ

1 голос
/ 25 марта 2019

NetCDF не имеет формата с фиксированной точностью, который бы сэкономил место так, как вы ожидаете. (См. здесь для типов данных). Обычный способ экономии места - это кодирование в виде короткого целого числа и установка атрибутов переменных scale_factor и add_offset.

В вашем случае вы умножили бы на 100, конвертировали в короткие и получили scale_factor=0.01. Выполнение этого в R, вероятно, является большой работой, но утилита nco справится с этим в несколько строк. Допустим, у вас есть переменная с именем rh.

ncap2 -v -s 'rh=short(100*rh)' in.nc out.nc
ncatted -O -h -a add_offset,rh,o,f,0 out.nc
ncatted -O -h -a scale_factor,rh,o,f,0.01 out.nc

Если вы хотите сэкономить память при чтении переменной в R, вы можете быть разочарованы, так как она будет просто преобразована обратно в число с плавающей точкой при чтении.

...