ошибка памяти numpy meshgrid в несетевом NetCDF

#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-битных плавающих значений!).