#python #arrays #numpy #memory #netcdf
#python #массивы #numpy #память #netcdf
Вопрос:
У меня есть 2 разных файла NetCDF: один «с сеткой», один «без сетки» (см. Примеры ниже).
Я пытаюсь использовать оба способа для создания сетки, как показано ниже :
dataset = Dataset(file_name)
data = dataset.variables['air_temp'][:]
lats = dataset.variables['lat'][:]
lons = dataset.variables['lon'][:]
print lats.shape
print lons.shape
lons, lats = np.meshgrid(lons,lats)
print lons.shape
print lats.shape
Привязаны к сетке : lats
: 1-D массив (720,) и lons
: 1-D массив (1440,)
и возвращаются после meshgrid
2-D массива (720,1440).
lats:
[-89.875 -89.625 -89.375 -89.125 -88.875 -88.625 -88.375 -88.125 -87.875
-87.625 -87.375 -87.125 -86.875 -86.625 -86.375 -86.125 -85.875 -85.625
...
85.625 85.875 86.125 86.375 86.625 86.875 87.125 87.375 87.625
87.875 88.125 88.375 88.625 88.875 89.125 89.375 89.625 89.875]
lons:
[ 1.25000000e-01 3.75000000e-01 6.25000000e-01 ..., 3.59375000e 02
3.59625000e 02 3.59875000e 02]
Не привязанный к сетке: lats
: 2-D массив (1080, 2048) и lons
(1080, 2048) Я ожидал бы после meshgrid
2-D массива (1080, 2048), но вместо этого он возвращается MemoryError
lats:
[[-34.18847656 -34.20410156 -34.21972656 ..., -40.50195312 -40.50488281
-40.5078125 ]
[-34.19726562 -34.21289062 -34.22851562 ..., -40.51171875 -40.51367188
-40.51660156]
[-34.20605469 -34.22167969 -34.23828125 ..., -40.52246094 -40.52441406
-40.52734375]
...,
[-43.77441406 -43.79394531 -43.81347656 ..., -50.73339844 -50.73339844
-50.734375 ]
[-43.78320312 -43.80175781 -43.82226562 ..., -50.7421875 -50.74316406
-50.74316406]
[-43.79199219 -43.81054688 -43.83105469 ..., -50.75195312 -50.75195312
-50.75292969]]
lons:
[[ 4.93164062 4.9765625 5.02148438 ..., 36.7734375 36.82421875
36.875 ]
[ 4.92675781 4.97167969 5.015625 ..., 36.77246094 36.82324219
36.87402344]
[ 4.921875 4.96679688 5.01171875 ..., 36.77148438 36.82226562
36.87304688]
...,
[ -1.18457031 -1.13574219 -1.08691406 ..., 36.3359375 36.3984375
36.45996094]
[ -1.19238281 -1.14257812 -1.09375 ..., 36.3359375 36.3984375
36.45996094]
[ -1.19921875 -1.14941406 -1.09960938 ..., 36.3359375 36.3984375
36.45996094]]
np.meshgrid
Отлично работает с сеткой: несколько мс почти без использования оперативной памяти, с другой стороны, сетчатый полностью отключает мой Mac. Я должен убить процесс python через монитор активности. Я думал, это потому, что на моем компьютере всего 4 ГБ оперативной памяти, но я попробовал с другом, работающим на Windows, с 16 ГБ и с той же проблемой.
Я видел только один пост, в котором говорилось об использовании меньших фрагментов данных, но этот файл NetCDF составляет всего 2 МБ! Как он может генерировать 16 ГБ оперативной памяти?
Форма массивов lats
и lons
«без сетки» связана с тем, что данные поступают из спутниковых измерений, тогда пиксели не являются идеальными «квадратами».
Комментарии:
1. Я использовал двойные кавычки, потому что термины с сеткой и без сетки недостаточно понятны для меня (новичок в SIG). Чтобы ответить на ваш вопрос, в «ungridded» NetCDF
lats
(аlons
также) является 2-мерным массивом, а его форма равна (1080, 2048). Если я сделаю то же самое с «сеткой»,lats
это будет одномерный массив (если бы это было то же измерение, его форма была бы (1080,) здесь.).2. Извините за плохую практику, я назову их по-другому. Итак, если я правильно понимаю, я не могу использовать два 2-D массива в качестве входных данных для a
np.meshgrid
? Это только для отображения двух одномерных векторов (или N одномерных векторов) в 2-D (N-D) массив? Я нашел альтернативу использованию библиотеки cartopy, которая работала с моими двумя двумерными массивами в качестве входных данных для lat / lon. Сейчас я смотрю на iris, который, похоже, отвечает большинству моих потребностей.3. Я думаю, вы неправильно понимаете, что
np.meshgrid
делает. Он просто создает сетки из векторов координат путем повторения. Я не могу вспомнить много ситуаций, когда имело бы смысл передавать массив > 1D в качестве входных данныхmeshgrid
. Мне кажется, что вы на самом деле пытаетесь интерполировать некоторые данные с неправильной выборкой в обычной 2D-сетке, и в этом случаеscipy.interpolate.griddata
было бы более уместно что-то вроде.4. Я отредактировал свой пост, чтобы вы могли видеть значения
lats
иlons
. Разница между ними заключается в том, что «с сеткой» представляет собой прямоугольник, а «без сетки» — почти прямоугольник, но «изогнутый». Первый файл уже был повторно привязан к сетке. Моей целью было создать сетчатую сетку для использования в базовой карте, как в этих примерах . Поскольку он работает с картографией (и, я думаю, с iris), и оба используют numpy, чего мне не хватает? Я не хочу интерполировать на этом шаге, поскольку я буду использовать функции переопределения iris.5. Если вы не хотите интерполировать, то как должен выглядеть результат? Если вы хотите, чтобы на выходе был прямоугольный массив, вам нужно будет чем-то заполнить недостающие значения вдоль «извилистых» краев (возможно, вы могли бы дополнить свой массив NaNs или использовать
np.masked_array
). ). Вам нужно быть более конкретным. В любом случае, причина ошибки памяти определенно заключается в том, что вы передаете большие 2D-массивыnp.meshgrid
(результатом для ваших «несетевых» данных будет пара(1080*2048, 1080*2048)
массивов, каждый из которых будет занимать ~ 40 ТБ оперативной памяти при условии 64-битных плавающих значений!).