Селектор CSS « General Sibling Combinator » может быть использован для того, что вы хотите:
E ~ F {
property: value;
}
Это соответствует любому элементу F
, которому предшествует E
].
Помните, что любой простой расчет среднего значения (суммирование и деление на сумму), такой как np.mean, не даст вам правильного ответа, если вы будете усреднять по сетке широты, поскольку область меняется по мере вашего движения к поляки Вам нужно взять средневзвешенное значение, взвешивающее по cos (lat).
Поскольку вы говорите, что у вас есть данные в формате netcdf, я надеюсь, что вы позволите мне предложить альтернативное решение из командной строки с помощью служебных операторов климатических данных (cdo) (в ubuntu вы можете установить с помощью sudo apt install cdo) .
, чтобы извлечь интересующую область:
cdo sellonlatbox,lon1,lon2,lat1,lat2 infile.nc outfile.nc
, затем вы можете определить правильное взвешенное среднее с
cdo fldmean infile.nc outfile.nc
, вы можете связать их вместе следующим образом:
cdo fldmean -sellonlatbox,lon1,lon2,lat1,lat2 infile.nc outfile.nc
Проблема в том, что вызов np.ma.filled
будет демаскировать переменную long
. Также np.meshgrid
не сохраняет маски.
Вы можете сохранить маски сразу после создания, а также создать сетку из масок. Я адаптировал ваш пример соответственно. Что можно видеть, так это то, что все версии numpy mean
учитывают маску. Мне пришлось адаптировать верхний предел (изменился на 2), потому что среднее было равным.
x = np.linspace(1, 10, 10)
y = np.linspace(1, 10, 10)
xm = np.median(x)
ym = np.median(y)
# Note: changed limits
x = np.ma.masked_outside(x, xm-3, xm+2)
y = np.ma.masked_outside(x, ym-3, ym+2)
xmask = np.ma.getmask(x)
ymask = np.ma.getmask(y)
x, y = np.meshgrid(x, y)
xmask, ymask = np.meshgrid(xmask, ymask)
z = 2*x + 3*y
z1 = np.ma.masked_where(np.ma.getmask(x), z)
z2 = np.ma.masked_where(xmask | ymask, z)
print(z1)
print(z2)
print('Type z1, z2:', type(z1), type(z2))
print('Maximum z1, z2:', np.nanmax(z1), np.nanmax(z2))
print('Minimum z1, z2:', np.nanmin(z1), np.nanmin(z2))
print('Mean z1, z2:', np.mean(z1), np.mean(z2) )
print('nan Mean z1, z2:', np.nanmean(z1), np.nanmean(z2) )
print('masked Mean z1, z2:', z1.mean(), z2.mean())