2016-03-24 19 views
0
ile yakın

Benim sorunum iplik Finding index of nearest point in numpy arrays of x and y coordinates problemin gibidir, ancak bunun genişletilmiş oluyor: daha iyi görselleştirme içinBulma yakın numpy dizide xy noktası ve ikinci durum

Buraya bir resim var orijinal (manipüle görüntü, gelen: 112BKS ile - arasından eigenes WerkOriginal grafik/Veri [.. ..?] CC bY-SA 3.0, link to page): bir dizi datafield orada bir taraftan source: Von 112BKS - Eigenes WerkOriginal graph/Data from [.. ? ..], CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=5949185

. [value x y] öğelerine sahip bir numpy dizisinden oluşur. Sayıları olan ince mavi çizgiler bunlar (value). Diğer taraftan [x y] öğelerine sahip bir sayı dizisinde orangeline dizisi vardır.

Yapmak istediklerim öğesinin orangeline'daki herhangi bir öğesinin hesaplanmasıdır.
Yeşil daire ile orangeline bir beton elemanını görüntüledim. Bunun değeri, üçgenlerle görselleştirilen datafield öğesinden iki öğe ile enterpolasyon yapabilir. datafield yılında
her element için bul içinde orangeline yakın eleman: Sonuç olarak ben yeşil daireyi bir value ilk adım

225 ila 230 olsun. (. Pembe üçgeni örnekte)

İkinci adım:
'orangeline' datafield en yakın eleman her eleman için ancak ilk adım olandan başka value ile bulun. (Kahverengi üçgen örnekte.)

Üçüncü aşama: iki kurulan değerleri ve bu elementlere mesafeler olanlardan orangeline her eleman için value enterposyonu.

ilk adım

mytree = scipy.spatial.cKDTree(datafield[:, 1:3]) 
dist1, indexes1 = mytree.query(orangeline) 

ile çözülebilir Ama şimdi ikinci adımı için DataField filtrelemek için nasıl bilmiyorum. Bir çözüm var mı?

+0

Veritabanının değerlerini enterpolasyonu için "griddata' kullanıyor" (http://stackoverflow.com/a/3867302/190597) 'yi dikkate aldınız mı? orangeline'? – unutbu

cevap

0

@unutbu 'un yardımı ile orangeline alanından geçmediği durumlarda da oldukça iyi çalışan bu çözümü buldum. Şimdi kod

def closest_node(points, datafield): 
    mytree = scipy.spatial.cKDTree(datafield) 
    dist, indexes = mytree.query(points) 
    return indexes 

Ve:

orangeline alınan değerler için ızgara en yakın noktayı bulmak için

import matplotlib.mlab as mlab 
import numpy as np 
import scipy 

def define_grid(rawdata): 
    xmin, xmax = np.amin(rawdata[:, 1]), np.amax(rawdata[:,1]) 
    ymin, ymax = np.amin(rawdata[:, 2]), np.amax(rawdata[:,2]) 

    x, y, z = rawdata[:, 1], rawdata[:, 2], rawdata[:, 0] 

    # Size of regular grid 
    ny, nx = (ymax - ymin), (xmax - xmin) 

    # Generate a regular grid to interpolate the data. 
    xi = np.linspace(xmin, xmax, nx) 
    yi = np.linspace(ymin, ymax, ny) 
    xi, yi = np.meshgrid(xi, yi) 

    # Interpolate using delaunay triangularization 
    zi = mlab.griddata(x,y,z,xi,yi) 
    return xi, yi, zi 

def grid_as_array(xi,yi,zi): 
    xi_flat, yi_flat, zi_flat = np.ravel(xi), np.ravel(yi), np.ravel(zi) 

    # reduce arrays for faster calculation, take only every second element 
    xi_red, yi_red, zi_red = xi_flat[1::2], yi_flat[1::2], zi_flat[1::2] 

    # stack to array with elements [x y z], but there are z values that are 'nan' 
    xyz_with_nan = np.hstack((xi_red[:, np.newaxis], yi_red[:, np.newaxis], 
           zi_red[:, np.newaxis])) 

    # sort out those elements with 'nan' 
    xyz = xyz_with_nan[~np.isnan(xyz_with_nan).any(axis=1)] 
    return xyz 

başka fonksiyonu: Burada

ızgara için fonksiyonlar
# use function to create from the raw data an interpolated datafield 
xi, yi, zi = define_grid(datafield) 

# rearrange those values to bring them in the form of an array with [x y z] 
xyz = grid_as_array(xi, yi, zi)  

# search closest values from grid for the points of the orangeline 
# orangeline_xy is the array with elements [x y] 
indexes = self.closest_node(orangeline_xy, xyz[:,0:2]) 

# take z values from the grid which we found before 
orangeline_z = xyz[indexes, 2] 

# add those z values to the points of the orangeline 
orangeline_xyz = np.hstack((orangeline_xy,orangeline_z[:, np.newaxis])) 
İlgili konular