Python — используйте список точек для извлечения данных из NetCDF с сеткой без циклов for

В следующем примере используется образец набора данных netCDF "Unidata" для восточного ветра, который может быть скачал отсюда (2,8 МБ)

У меня есть два списка целых чисел, которые соответствуют индексам x и y массива с координатной сеткой в ​​файле netCDF. Я хочу извлечь данные и сохранить их в одномерном массиве или списке для каждой из комбинаций точек (например, точек: [(x[0],y[0]), (x[1],y[1]), (x[2],y[2]), ... , (x[n],y[n])]).

Я могу сделать это довольно легко, используя этот метод...

from netCDF4 import Dataset

# grid point lists
lat = [20, 45, 56, 67, 88, 98, 115]
lon = [32, 38, 48, 58, 87, 92, 143]

# open netCDF file
nc_file = "./sresa1b_ncar_ccsm3-example.nc"
fh = Dataset(nc_file, mode='r')

# extract variable
point_list = zip(lat,lon)
ua_list = []
for i, j in point_list:
    ua_list.append(fh.variables['ua'][0,16,i,j])

print(ua_list)

Что возвращает:

[59.29171, 17.413916, -4.4006901, -11.15424, -5.2684789, 2.1235929, -6.134573]

Однако append() неуклюж для больших наборов данных, и я пытаюсь ускорить свой код, поэтому я также не хочу использовать цикл for и скорее возвращаю результаты в одной строке. Я пытался сделать это, используя эту строку:

# extract variable
ua_array = fh.variables['ua'][0,16,lat,lon]
print(ua_array)

Который возвращает каждую возможную комбинацию точек, а не только те, которые мне нужны:

[[ 59.2917099   60.3418541   61.81352234  62.66215515  60.6419754 60.00745392  52.48550797]
[ 18.80122566  17.41391563  14.83201313  12.67425823  13.99616718 14.4371767   14.12419605]
[ -5.56457043  -5.20643377  -4.40069008  -3.25902319  -2.36573601 -2.25667071  -1.0884304 ]
[-11.66207981 -11.46785831 -11.35252953 -11.15423965 -11.35271263 -11.55139542 -11.68573093]
[ -1.15064895  -1.52471519  -2.12152767  -2.67548943  -5.26847887 -5.79328251  -6.16713762]
[ -1.95770085  -0.56232995   0.82722098   1.39629912   2.65125418 2.12359285  -6.47501516]
[ -9.76508904 -10.13490105 -10.76805496 -11.31607246 -11.93865585 -11.56440639  -6.13457298]]

Как я могу нарезать файл netCDF, чтобы получить тот же результат, что и приведенный выше код, в одной строке? Заранее спасибо.


person Muon    schedule 08.03.2018    source источник


Ответы (1)


Сначала выполните обычное индексирование с помощью 0и 16, а затем расширенное индексирование с помощью lat и lon:

ua_array = fh.variables['ua'][0,16][lat,lon]
print(ua_array)

Выход:

[ 59.2917099   17.41391563  -4.40069008 -11.15423965  -5.26847887
   2.12359285  -6.13457298]

Кстати, ua_array — это массив NumPy. Поэтому называть его ua_list немного вводит в заблуждение.

person Mike Müller    schedule 08.03.2018
comment
Большое спасибо @Mike. Да, вы правы, я должен был назвать их массивами. Я отредактирую вопрос для дальнейшего использования. Ваше здоровье. - person Muon; 08.03.2018