Le rééchantillonnage espacés de manière irrégulière des données d'une grille régulière en Python
J'ai besoin de ré-échantillonner 2D des données d'une grille régulière.
C'est ce que mon code ressemble à ceci:
import matplotlib.mlab as ml
import numpy as np
y = np.zeros((512,115))
x = np.zeros((512,115))
# Just random data for this test:
data = np.random.randn(512,115)
# filling the grid coordinates:
for i in range(512):
y[i,:]=np.arange(380,380+4*115,4)
for i in range(115):
x[:,i] = np.linspace(-8,8,512)
y[:,i] -= np.linspace(-0.1,0.2,512)
# Defining the regular grid
y_i = np.arange(380,380+4*115,4)
x_i = np.linspace(-8,8,512)
resampled_data = ml.griddata(x,y,data,x_i,y_i)
(512,115) est la forme des données en 2D, et j'ai déjà installé mpl_toolkits.natgrid.
Mon problème est que je serai de retour masqué de tableau, où la plupart des entrées sont nan, au lieu d'un tableau qui est principalement composé de participations ordinaires et nan juste à la frontière.
Quelqu'un pourrait-il m'indiquer ce que je fais de mal?
Merci!
- Comme première étape, j'ai essayé d'exécuter votre exemple de code et ça ne fonctionne pas. Je suis un
ValueError: x,y must be equal length 1-D arrays
. Je suis en cours d'exécution matplotlib v0.99.3 de la Enthought de distribution. Pouvez-vous résoudre l'exemple de sorte qu'il reproduit le NaN, et également inclure plus d'infos à ce que l'entrée/sortie de votre calcul serait, peut-être avec un graphique si c'est possible? - Je pense que vous devez avoir natgrid de la mpl_toolkits installé pour l'exemple de travailler.
Vous devez vous connecter pour publier un commentaire.
De la comparaison de votre exemple de code à votre question du titre, je pense que vous êtes un peu confus...
Dans votre exemple de code, vous êtes en train de créer régulièrement maillées données aléatoires et puis rééchantillonnage sur une autre grille régulière. Vous n'avez pas de données irrégulières n'importe où dans votre exemple...
(D'ailleurs, le code ne s'exécute pas comme-est, et vous devriez regarder dans
meshgrid
plutôt qu'en parcourant pour générer votre x & y les grilles.)Si vous êtes désireux de ré-échantillonner un déjà régulièrement échantillonnés de la grille, comme vous le faites dans votre exemple, il y a des méthodes plus efficaces que griddata ou quoi que ce soit que je vais décrire ci-dessous. (
scipy.ndimage.map_coordinates
serait bien adapté à votre problème, il que le cas.)Basé sur votre question, cependant, il semble que vous avez irrégulièrement espacés de données que vous souhaitez interpolation sur une grille régulière.
Dans ce cas, vous pourriez avoir quelques points comme ceci:
Vous pouvez ensuite interpoler les données comme vous le faisiez avant... (Suite de l'extrait de code ci-dessus...)
Cependant, vous remarquerez que vous obtenez beaucoup d'artefacts dans la grille. Cela est dû au fait que vos coordonnées x vont de -8 à 8, tandis que les coordonnées y vont de ~300 ~2500. L'algorithme d'interpolation est d'essayer de rendre les choses isotrope, alors vous voudrez peut-être un très anisotrope d'interpolation (de sorte qu'il apparaît isotrope lorsque la grille est tracée).
Pour corriger cela, vous devez créer un nouveau système de coordonnées pour faire de votre interpolation. Il n'y a pas une seule bonne façon de le faire. Ce que je suis en utilisant ci-dessous, mais la "meilleure" façon dépend fortement de ce que vos données représente en fait.
(En d'autres termes, ce que vous savez sur le système que vos données sont en mesure de décider de la façon de le faire. C'est toujours vrai avec interpolation! Vous ne devriez pas interpoler à moins que vous savoir ce que le résultat devrait ressembler à, et sont assez familiers avec l'algorithme d'interpolation à utiliser que les a priori de l'information à votre avantage!! Il y a aussi beaucoup plus souple algorithmes d'interpolation de la triangulation de Delaunay qui griddata utilise par défaut, en tant que bien, mais c'est bien pour un simple exemple...)
En tout cas, une façon de le faire est de le redimensionner les coordonnées x et y de sorte qu'ils vont à peu près de la même grandeur. Dans ce cas. nous allons changer l'échelle de 0 à 1... (pardonnez le spaghetti code de chaîne... je suis juste vouloir être un exemple...)
Espère que ça aide, en tout cas... Désolé pour la longueur de la réponse!
mlab.griddata
de documentation qui est presque laconique dans la comparaison.mlab.griddata
utilisescipy.interpolate.griddata
sous le capot, qui a beaucoup plus de documentation