matplotlib.mlab.griddata очень медленный и возвращает массив nan при вводе правильных данных

Я пытаюсь сопоставить набор данных с нерегулярной сеткой (необработанные спутниковые данные) с соответствующими широтами и долготами с набором широт и долгот с регулярной сеткой, заданным basemap.makegrid(), я использую matplotlib.mlab.griddata с mpl_toolkits.natgrid установлены. Ниже приведен список переменных, используемых в качестве вывода whos в ipython и немного статистики по переменным:

Variable   Type       Data/Info
-------------------------------
datalat    ndarray    666x1081: 719946 elems, type `float32`, 2879784 bytes (2 Mb)
datalon    ndarray    666x1081: 719946 elems, type `float32`, 2879784 bytes (2 Mb)
gridlat    ndarray    1200x1000: 1200000 elems, type `float64`, 9600000 bytes (9 Mb)
gridlon    ndarray    1200x1000: 1200000 elems, type `float64`, 9600000 bytes (9 Mb)
var        ndarray    666x1081: 719946 elems, type `float32`, 2879784 bytes (2 Mb)

In [11]: var.min()
Out[11]: -30.0

In [12]: var.max()
Out[12]: 30.0

In [13]: datalat.min()
Out[13]: 27.339874

In [14]: datalat.max()
Out[14]: 47.05302

In [15]: datalon.min()
Out[15]: -137.55658

In [16]: datalon.max()
Out[16]: -108.41629

In [17]: gridlat.min()
Out[17]: 30.394031556984299

In [18]: gridlat.max()
Out[18]: 44.237140350357713

In [19]: gridlon.min()
Out[19]: -136.17646180595321

In [20]: gridlon.max()
Out[20]: -113.82353819404671

datalat а также datalon координаты данных оригинала

gridlat а также gridlon координаты для интерполяции

var содержит фактические данные

Используя эти переменные, когда я звоню griddata(datalon, datalat, var, gridlon, gridlat) это заняло до 20 минут, и возвращает массив nan, При просмотре данных широта и долгота кажутся правильными: исходные координаты перекрывают часть новой области, а несколько точек данных лежат за пределами новой области. У кого-нибудь есть предложения? Значения Nan предполагают, что я делаю что-то глупое...

4 ответа

Решение

Похоже, mlab.griddata рутина может вводить дополнительные ограничения на ваши выходные данные, которые могут не быть необходимыми. Хотя входные местоположения могут быть любыми, выходные местоположения должны быть регулярной сеткой - так как ваш пример находится в широтном / долгом пространстве, ваш выбор проекции карты может нарушить это (т.е. обычная сетка в x/y не является регулярной сеткой в ​​лат. / долгота).

Вы можете попробовать interpolate.griddata подпрограмма из SciPy в качестве альтернативы - вам нужно будет объединить ваши переменные местоположения в один массив, так как сигнатура вызова отличается: что-то вроде

import scipy.interpolate
data_locations = np.vstack(datalon.ravel(), datalat.ravel()).T
grid_locations = np.vstack(gridlon.ravel(), gridlat.ravel()).T
grid_data      = scipy.interpolate.griddata(data_locations, val.ravel(),
                                            grid_locations, method='nearest')

для интерполяции ближайшего соседа. Это получает местоположения в массиве с 2 столбцами, соответствующими вашим 2 измерениям. Вы также можете выполнить интерполяцию в преобразованном пространстве вашей картографической проекции.

Скорее всего, griddata слишком сложна. Он предназначен для работы со случайно выбранными данными. Ваши данные почти наверняка регулярно отбираются - но не в той же самой сетке, что и целевая выходная сетка.

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

Есть некоторые готовые решения, которые могут помочь. GDAL является хорошим примером.

Кроме того, этот тип проблемы часто обсуждается в ГИС. Увидеть:

https://gis.stackexchange.com/questions/10430/changing-image-projection-using-python

Если ваши данные находятся в сетке, так что данные указывают на точку (datalon[i], datalat[j]) в data[i,j]тогда вы можете использовать scipy.interpolate.RectBivariateSpline вместо griddata, Однако некоторые специфические для географии библиотеки могут предлагать больше функциональных возможностей.

Если вы используете pclormesh, вам не нужно выполнять какую-либо интерполяцию. pcolormesh с удовольствием примет структуру данных, как вы указали здесь:

from mpl_toolkits.basemap import Basemap
m = Basemap(-----)
x,y = m(datalon, datalat)
m.pcolormesh(x,y,var)
plt.show()

Пожалуйста, используйте это и скажите мне, работает ли это или нет.

Однако в pcolormesh возникает некоторая проблема, когда данные орбиты перекрываются. Пожалуйста, обратитесь к моему вопросу, вы можете найти что-то полезное.

Использование pcolormesh для построения данных орбиты

Другие вопросы по тегам