2016-12-12 2 views
0

Моих данные выглядят следующим образом Dataинтерполирование случайных данных в регулярную сетку

Я хочу, чтобы интерполировать это сетку 4 ячейки. Каждая ячейка имела бы только средние значения всех точек, лежащих внутри нее. enter image description here

Выход тогда должен выглядеть следующим образом

enter image description here

Таким образом, мы превратили все данные в виде матрицы 2х2. Каждая ячейка этой матрицы будет иметь среднюю координату x & средние координаты y всех точек, лежащих внутри них.

A1 = (3, -3); A2 = (3,5, 1,5)

A3 = (-1, -3); A4 = (-2,1)

===== ЧТО IVE Пробовал =====

avg = [[ 
     (
      (mat[row][col][0] 
      + mat[row][col+1][0] 
      + mat[row+1][col][0] 
      + mat[row+1][col+1][0])/4.0 
     , 
      (mat[row][col][1] 
      + mat[row][col+1][1] 
      + mat[row+1][col][1] 
      + mat[row+1][col+1][1])/4.0 
     ) 
     for col in range(0, len(mat[0]), 2) ] 
    for row in range(0, len(mat), 2) 
] 
+2

Кажется просто, что вы пробовали? – jandob

+0

@jandob Я смотрел на этот https://scipy.github.io/old-wiki/pages/Cookbook/Matplotlib/Gridding_irregularly_spaced_data.html, но его фактический blob, а не среднюю аппроксимацию данных на сетки с равномерным распределением – vinita

+0

Пожалуйста, отредактируйте свой вопрос и поместите в него код (чтобы он был доступен для чтения). – martineau

ответ

1

Я не так хорошо с Numpy/SciPy, я думаю, что это может быть значительно улучшена с точки зрения изящества и эффективности, но это работает:

-> jupyter notebook with intermediate plots

Окончательный код:

import numpy as np 
import matplotlib.pyplot as plt 
import math 
data = np.random.uniform(low=-2.0, high=2.0, size=(2,100)) 
dataX = data[0] 
dataY = data[1] 

#plot the data 
plt.plot(data[0], data[1], 'b+') 

gridSize = 1.0 

# grid coordinates are lower left point of grid rectangles 
gridMaxX = math.floor(max(dataX)/gridSize) 
gridMaxY = math.floor(max(dataY)/gridSize) 
gridMinX = math.floor(min(dataX)/gridSize) 
gridMinY = math.floor(min(dataY)/gridSize) 

gridX = np.arange(gridMinX,gridMaxX + gridSize, gridSize) 
gridY = np.arange(gridMinY,gridMaxY + gridSize, gridSize) 

#plot the grid 
for ix, x in enumerate(gridX): 
    plt.axvline(x=x) 
for iy, y in enumerate(gridY): 
    plt.axhline(y=y) 

#iterate the grid 
for gridPosX in gridX: 
    for gridPosY in gridY: 
     inCell = lambda x,y: (gridPosX<x and x<gridPosX+gridSize 
           and gridPosY<y and y<gridPosY+gridSize) 

     pointsInCell = [ (x,y) for (x,y) in zip(dataX, dataY) if inCell(x,y)] 
     if len(pointsInCell) > 0: 
      xPos, yPos = zip(*pointsInCell) 
      plt.plot(np.mean(xPos), np.mean(yPos), 'ro') 
plt.show() 
+0

@vinita Если это сработает для вас, было бы неплохо, если бы вы приняли этот ответ. – jandob

+0

можно сохранить все точки '[np.mean (xPos), np.mean (yPos)]', а не отображать и показывать. Потому что за миллион очков я не могу их заговорить. Поэтому Id скорее сохранит их в списке. – vinita

+0

уверен, просто создайте два списка перед циклом 'meanX = []; означает Y = [] 'и вместо того, чтобы рисовать добавление в списки' означаетX.append (np.mean (xPos)) '. Или добавьте их в один список как кортежи. Зависит от того, для чего вам это нужно. Но я думаю, вы можете понять это сами. :) – jandob

Смежные вопросы