Questa questione è stata modificato dopo risposte per mostra soluzione finale ho usatoInterpolazione strutturati X, Y, Z Dati sulle migliori griglia in base vicina distanza prossimo per ogni punto
Ho insiemi di dati 2D non strutturati provenienti da fonti diverse, come nell'esempio: Questi set di dati sono 3 numpy.ndarray (coordinate X, Y e valore Z).
Il mio obiettivo finale è quello di interpolare questi dati su una griglia per la conversione in immagine/matrice. Quindi, ho bisogno di trovare la "griglia migliore" per i dati di tesi interpolati. E per questo ho bisogno di trovare il miglior passo X e Y tra i pixel di quella griglia.
passo Determinato in base alla distanza euclidea tra i punti:
Utilizzare la media delle distanze euclidee tra ciascun punto e il suo vicino più vicino.
- Usa
KDTree
/cKDTree
da scipy.spacial per l'albero build del X, Y dati. - Utilizzare il metodo
query
conk=2
per ottenere le distanze (Sek=1
, le distanze sono solo pari a zero perché la query per ogni punto si è trovata).
# Generate KD Tree
xy = np.c_[x, y] # X,Y data converted for use with KDTree
tree = scipy.spacial.cKDTree(xy) # Create KDtree for X,Y coordinates.
# Calculate step
distances, points = tree.query(xy, k=2) # Query distances for X,Y points
distances = distances[:, 1:] # Remove k=1 zero distances
step = numpy.mean(distances) # Result
performance tweaking:
- L'uso della
scipy.spatial.cKDTree
e nonscipy.spatial.KDTree
perché è davvero più veloce. - Utilizzare
balanced_tree=False
conscipy.spatial.cKDTree
: Grande velocità nel mio caso, ma potrebbe non essere vero per tutti i dati. - Utilizzare
n_jobs=-1
concKDTree.query
per utilizzare il multithreading. - Utilizzare
p=1
concKDTree.query
per utilizzare la distanza di Manhattan al posto della distanza euclidea (p=2
): Più veloce ma potrebbe essere meno preciso. - Interroga la distanza solo per un sottocampione casuale di punti: grande velocità con dataset di grandi dimensioni, ma potrebbe essere meno preciso e meno ripetibile.
punti Per interpolazione sulla griglia:
punti Interpolazione set di dati sulla rete utilizzando il passo calcolato.
# Generate grid
def interval(axe):
'''Return numpy.linspace Interval for specified axe'''
cent = axe.min() + axe.ptp()/2 # Interval center
nbs = np.ceil(axe.ptp()/step) # Number of step in interval
hwid = nbs * step/2 # Half interval width
return np.linspace(cent - hwid, cent + hwid, nbs) # linspace
xg, yg = np.meshgrid(interval(x), interval(y)) # Generate grid
# Interpolate X,Y,Z datas on grid
zg = scipy.interpolate.griddata((x, y), z, (xg, yg))
Set NaN se pixel troppo lontano dalla sigla punti:
Set NaN a pixel da griglia che sono troppo (Distance> passo) dai punti da iniziale X, Y, Z dati. Viene utilizzato il precedente KDTree generato.
# Calculate pixel to X,Y,Z data distances
dist, _ = tree.query(np.c_[xg.ravel(), yg.ravel()])
dist = dist.reshape(xg.shape)
# Set NaN value for too far pixels
zg[dist > step] = np.nan
Qual è stato il problema con KDTree di Scipy? – M4rtini
Ho provato ad usarlo con il metodo 'query', ma, per ogni punto, il risultato è esso stesso. Altri metodi non sembrano essere utili nel mio caso. Questo sembra essere fatto per lavorare con 2 diversi set di coordinate. –
Usa 'query' con k = 2. Il secondo punto dovrebbe quindi essere il vicino più vicino. – M4rtini