Как считать переменные с плавающей запятой NetCDF в массив Numpy с той же точностью и масштабом, что и исходные значения с плавающей запятой NetCDF?
У меня есть файл NetCDF, который содержит переменную со значениями с плавающей запятой с точностью / масштабом == 7/2, т.е. возможны значения от -99999,99 до 99999,99.
Когда я беру часть значений из переменной NetCDF и смотрю на них в моем отладчике, я вижу, что значения, которые у меня сейчас есть в моем массиве, имеют большую точность / масштаб, чем то, что я вижу в исходном NetCDF. Например, когда я смотрю на значения в средстве просмотра ToosUI/ncdump, они отображаются как "-99999.99" или "12.45", но когда я смотрю на значения в массиве слайсов, они выглядят как "-99999.9921875" (большая длина шкалы). Поэтому, если я использую "-99999,99" в качестве ожидаемого значения для обозначения отсутствующей точки данных, я не получу совпадения с тем, что вытягивается в массив слайсов, поскольку эти значения имеют большую длину шкалы и дополнительные цифры в Шкала - это не просто нули для заполнения.
Например, я вижу это, если я делаю ncdump для точки в наборе данных NetCDF:
Variable: precipitation(0:0:1, 40:40:1, 150:150:1)
float precipitation(time=1348, lat=180, lon=360);
:units = "mm/month";
:long_name = "precipitation totals";
data:
{
{
{-99999.99}
}
}
Однако, если я получу кусок данных из переменной, например, так:
value = precipitationVariable[0:1:1, 40:41:1, 150:151:1]
затем я вижу это в моем отладчике (Eclipse/PyDev):
value == ndarray: [[[-99999.9921875]]]
Таким образом, кажется, что значения набора данных NetCDF, которые я читаю в массив Numpy, не читаются с той же точностью / масштабом исходных значений в файле NetCDF. Или, может быть, значения в NetCDF на самом деле совпадают с теми, что я вижу, когда читаю их, но то, что мне показывают через ncdump, усекается из-за некоторых настроек формата в самой программе ncdump.
Кто-нибудь может посоветовать, что здесь происходит? Заранее спасибо за помощь.
Кстати, я разрабатываю этот код с использованием Python 2.7.3 на компьютере под управлением Windows XP и с помощью модуля Python для API-интерфейса NetCDF4, предоставленного здесь: https://code.google.com/p/netcdf4-python/
1 ответ
Не существует простого способа сделать то, что вы хотите, потому что numpy хранит значения с одинарной точностью, поэтому они всегда будут иметь конечные числа после 0,99.
Однако netCDF уже предоставляет механизм для пропущенных данных (см. Руководство по передовым методам). Как файл netCDF был написан в первую очередь? missing_value
является специальным атрибутом переменной, который должен использоваться, чтобы указать те значения, которые отсутствуют. В интерфейсах C и Fortran при создании файла все значения переменных задаются как отсутствующие. Если вы написали переменную всего за один раз, вы можете установить missing_value
Атрибут для массива индексов, где значения отсутствуют. Подробнее о значениях заполнения в интерфейсах C и Fortran. Это рекомендуемый подход. Модуль python netCDF4 хорошо работает с этими пропущенными значениями, и такие массивы считаются замаскированными в numpy.
Если вам нужно работать с файлом, который у вас есть в данный момент, я бы предложил создать маску, чтобы покрыть значения вокруг вашего пропущенного значения:
import numpy as np
value = precipitationVariable[:]
mask = (value < -99999.98) & (value > -100000.00)
value = np.ma.MaskedArray(value, mask=mask)