Найти более простой способ группировать 2-мерные данные рассеяния в данные массива сетки

Я вычислил метод группировки данных дисперсных точек в структурированный 2-й массив (например, функцию растеризации ). И я надеюсь, что есть несколько лучших способов достижения этой цели.

Моя работа

1. Введение

  • 1000 точечных данных имеют размеры свойств (lon, lat, эмиссия), которые представляют один завод, расположенный в (x, y), выделяют определенное количество CO2 в атмосферу
  • сетка сетки : предопределите 2-й массив в форме 20×20

http://i4.tietuku.com/02fbaf32d2f09fff.png

Код, воспроизводимый здесь:

#### define the map area xc1,xc2,yc1,yc2 = 113.49805889531724,115.5030664238035,37.39995194888143,38.789235929357105 map = Basemap(llcrnrlon=xc1,llcrnrlat=yc1,urcrnrlon=xc2,urcrnrlat=yc2) #### reading the point data and scatter plot by their position df = pd.read_csv("xxxxx.csv") px,py = map(df.lon, df.lat) map.scatter(px, py, color = "red", s= 5,zorder =3) #### predefine the grid networks lon_grid,lat_grid = np.linspace(xc1,xc2,21), np.linspace(yc1,yc2,21) lon_x,lat_y = np.meshgrid(lon_grid,lat_grid) grids = np.zeros(20*20).reshape(20,20) plt.pcolormesh(lon_x,lat_y,grids,cmap = 'gray', facecolor = 'none',edgecolor = 'k',zorder=3) 

2. Моя цель

  1. Поиск ближайшей точки сетки для каждой фабрики
  2. Добавить данные о выбросах в это число сетки

3. Реализация алгоритма

3.1 Растровая сетка

примечание : 20×20 точек сетки распределены в этой области, представленной синей точкой.

http://i4.tietuku.com/8548554587b0cb3a.png

3.2 KD-дерево

Найдите ближайшую синюю точку каждой красной точки

 sh = (20*20,2) grids = np.zeros(20*20*2).reshape(*sh) sh_emission = (20*20) grids_em = np.zeros(20*20).reshape(sh_emission) k = 0 for j in range(0,yy.shape[0],1): for i in range(0,xx.shape[0],1): grids[k] = np.array([lon_grid[i],lat_grid[j]]) k+=1 T = KDTree(grids) x_delta = (lon_grid[2] - lon_grid[1]) y_delta = (lat_grid[2] - lat_grid[1]) R = np.sqrt(x_delta**2 + y_delta**2) for i in range(0,len(df.lon),1): idx = T.query_ball_point([df.lon.iloc[i],df.lat.iloc[i]], r=R) # there are more than one blue dot which are founded sometimes, # So I'll calculate the distances between the factory(red point) # and all blue dots which are listed if (idx > 1): distance = [] for k in range(0,len(idx),1): distance.append(np.sqrt((df.lon.iloc[i] - grids[k][0])**2 + (df.lat.iloc[i] - grids[k][1])**2)) pos_index = distance.index(min(distance)) pos = idx[pos_index] # Only find 1 point else: pos = idx grids_em[pos] += df.so2[i] 

4. Результат

 co2 = grids_em.reshape(20,20) plt.pcolormesh(lon_x,lat_y,co2,cmap =plt.cm.Spectral_r,zorder=3) 

http://i4.tietuku.com/6ded65c4ac301294.png

5. Мой вопрос

  • Может ли кто-нибудь указать на некоторые недостатки или ошибки этого метода?
  • Есть ли какие-то алгоритмы, более близкие к моей цели?

Большое спасибо!

One Solution collect form web for “Найти более простой способ группировать 2-мерные данные рассеяния в данные массива сетки”

В коде есть много for-loop, это не так.

Сначала сделайте некоторые данные выборки:

 import numpy as np import pandas as pd from scipy.spatial import KDTree import pylab as pl xc1, xc2, yc1, yc2 = 113.49805889531724, 115.5030664238035, 37.39995194888143, 38.789235929357105 N = 1000 GSIZE = 20 x, y = np.random.multivariate_normal([(xc1 + xc2)*0.5, (yc1 + yc2)*0.5], [[0.1, 0.02], [0.02, 0.1]], size=N).T value = np.ones(N) df_points = pd.DataFrame({"x":x, "y":y, "v":value}) 

Для равных пространственных сеток вы можете использовать hist2d() :

 pl.hist2d(df_points.x, df_points.y, weights=df_points.v, bins=20, cmap="viridis"); 

Вот результат:

введите описание изображения здесь

Вот код для использования KdTree :

 X, Y = np.mgrid[x.min():x.max():GSIZE*1j, y.min():y.max():GSIZE*1j] grid = np.c_[X.ravel(), Y.ravel()] points = np.c_[df_points.x, df_points.y] tree = KDTree(grid) dist, indices = tree.query(points) grid_values = df_points.groupby(indices).v.sum() df_grid = pd.DataFrame(grid, columns=["x", "y"]) df_grid["v"] = grid_values fig, ax = pl.subplots(figsize=(10, 8)) ax.plot(df_points.x, df_points.y, "kx", alpha=0.2) mapper = ax.scatter(df_grid.x, df_grid.y, c=df_grid.v, cmap="viridis", linewidths=0, s=100, marker="o") pl.colorbar(mapper, ax=ax); 

выход:

введите описание изображения здесь

  • Как удалить элементы из списка кортежей?
  • Суммирование по размеру широковещательного широковещания в numpy.einsum
  • стратифицированная выборка в numpy
  • Эффективное обнаружение двухмерного края в Python
  • Назначить значение нескольким срезам в numpy
  • Как вы получаете среднее значение и std столбца в csr_matrix?
  • Повторная запись чисел записывает байтовые литералы в мой файл csv?
  • Установите максимальное количество потоков во время выполнения на numpy / openblas
  •  
    Interesting Posts for Van-Lav

    Недействительный аргумент сокета приложения Engine

    Сообщение об ошибке Python «Несовместимая версия библиотеки» libxml и etree.so

    Передача переменной сеанса между шаблонами в колбе

    Для чего используется unicode_literals?

    Как сделать список из матричной матрицы в Python

    как открыть две вкладки в python splinter

    Функции записи, которые принимают как массивы 1-D, так и 2-D numpy?

    python2.6.6 Преобразование временной отметки времени Apache в секундах с эпохи (стиль unix)

    Установленное приложение Python и идентификатор клиента Google

    Могу ли я использовать свой собственный класс Python с numpy или какой-либо другой библиотекой матриц?

    Цитирование и сравнение строк двух неравномерных словарей

    Нечувствительный к регистру поиск в Python ElementTree

    Переменная экземпляра класса Python mock

    Ошибка: нет модуля с именем psycopg2.extensions

    Python, использование удаленных менеджеров и многопроцессорность

    Python - лучший язык программирования в мире.