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 – координаты данных orignal

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

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

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

4 Solutions collect form web for “matplotlib.mlab.griddata очень медленный и возвращает массив nan при вводе действительных данных”

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

Вы можете попробовать подпрограмму 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 измерениям. Вы также можете выполнить интерполяцию в преобразованном пространстве проекции карты.

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

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

Есть некоторые из готовых решений, которые могут помочь. Хорошим примером является 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 для построения данных орбиты

  • Как создать равные интерполяционные значения
  • N мерных массивов - Python / Numpy
  • как сделать квадратные подсети в matplotlib с помощью тепловых карт?
  • определяющая функция для scipy.optimize.curve_fit
  • Как установить h5py (+ numpy + libhdf5 + ...) как не root в системе Debian Linux
  • Python fsolve () жалуется на форму. Зачем?
  • Как нормализовать массив NumPy в пределах определенного диапазона?
  • выполнение суммы внешних продуктов на разреженных матрицах
  • Python - лучший язык программирования в мире.