matplotlib creando matrices 2D a partir de matrices 1D: ¿hay alguna forma más agradable?

Estoy tratando de visualizar algunos datos 3D que tengo usando gráficos de contorno matplotlibs, gráficos de superficie y gráficos de estructura de alambre.

mis datos en bruto tienen la forma de una matriz numpy con x, y y z cada uno en su propia columna (por ejemplo):

| xs | ys | zs |
| — | — | —- |
| 1 | 1 | 3 |
| 2 | 1 | 4 |
| 3 | 1 | 2 |
| 4 | 1 | 3 |
| 5 | 1 | 5 |
| 1 | 2 | -1 |
| 2 | 2 | -1 |
| 3 | 2 | -2 |
| 4 | 2 | 2 |
| 5 | 2 | 7 |
| 1 | 3 | 5 |
| 2 | 3 | 2 |
| 3 | 3 | 3 |
| 4 | 3 | 2 |
| 5 | 3 | 3 |

Ahora, algunas de las funciones de trazado solo toman los datos en matrices 1D correspondientes a mis columnas (xs, ys, zs). Sin embargo, algunos requieren un formato de matriz 2D (meshgrid). ¿Hay una manera fácil de convertir de las matrices 3 1D al formato correcto de 3 matrices 2D? He intentado usar numpy.meshgrid y, aunque esto funciona para crear matrices X e Y 2D, no puedo encontrar una buena forma de crear la matriz Z 2D correspondiente. Lo he logrado haciendo una matriz 2D en blanco y llenándola con los valores adecuados para Z, pero esto no es muy bueno. ¿Hay una mejor manera de crear la matriz Z 2D?

A continuación se muestra mi bash (que funciona). ¿Hay alguna manera de hacer que la matriz Z se mueva a través de X e Y?

def getMeshGrid(dataArray): """get 2d coordinate grid and Z values in meshgrid format. requires values in dataArray to have a rectangular region of xy space covered uniformly""" xs = dataArray[:,0] ys = dataArray[:,1] xmin,xmax = xs.min(), xs.max() xstep = xs[xs!=xmin].min()-xmin ymin,ymax = ys.min(), ys.max() ystep = ys[ys!=ymin].min()-ymin X = numpy.arange(xmin, xmax+xstep, xstep) Y = numpy.arange(ymin, ymax+ystep, ystep) X,Y = numpy.meshgrid(X,Y) Z = numpy.zeros(X.shape) height, width = X.shape for i in range(0, height): for j in range(0,width): halfway = dataArray[dataArray[:,0]==X[i,j]] # finds all with that value of x row = halfway[halfway[:,1]==Y[i,j]] # finds y value Z[i,j] = row[0,6] return X,Y,Z 

Gracias por adelantado

Si sus datos son como los que dio en el ejemplo, ya tiene una malla (tiene un valor de z para cada par (x, y)) y solo necesita remodelar las matrices:

 cols = np.unique(xs).shape[0] X = xs.reshape(-1, cols) Y = ys.reshape(-1, cols) Z = zs.reshape(-1, cols)