Хотите создать массив с нулями, когда данные маскируются, и массивы, когда данные не маскируются - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть данные netcdf, которые маскируются. Данные в (время, широта, долгота). Я хотел бы создать массив с тем же размером, что и исходные данные, но с нулями, когда данные маскируются, и с теми, где они не маскируются. Поэтому я попытался сделать эту функцию:

def find_unmasked_values(data):
   empty = np.ones((len(data),len(data[0]),len(data[0,0])))
   for k in range(0,len(data[0,0]),1): # third coordinate
       for j in range(0,len(data[0]),1): # second coordinate
           for i in range(0,len(data),1): # first coordinate
               if ma.is_mask(data[i,j,k]) is True:
                   empty[i,j,k] = 0
   return(empty)

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

1 Ответ

1 голос
/ 24 февраля 2020

Будьте проще! Нет необходимости во всех ручных циклах, что сделает ваш подход очень медленным для больших наборов данных. Небольшой пример с некоторыми другими данными (где thl является маскированной переменной):

import netCDF4 as nc4

nc  = nc4.Dataset('bomex_qlcore_0000000.nc')
var = nc['default']['thl'][:]

mask_1 = var.mask  # masked=True, not masked=False
mask_2 = ~var.mask # masked=False, not masked=True

# What you need:
int_mask = mask_2.astype(int) # masked=0, not masked=1

пс: некоторые другие примечания:

  • Вместо len(array), len(array[0]) и так далее, вы также можете напрямую получить форму вашего массива с помощью array.shape, который возвращает набор с размерами массива.
  • Если вы хотите создать новый массив с такими же размерами, что и у другого, просто используйте empty = np.ones_like(data) (или np.zeros_like(), если вам нужен массив с нулями).
  • ma.is_mask() уже возвращает bool; Не нужно сравнивать это с Истиной.
  • Не путайте is с ==: Есть ли разница между "==" и "is"?
...