我正在尝试使用matplotlibs等高线图,曲面图和线框图来显示我所拥有的一些三维数据。
我的原始数据是一个numpy数组的形式,x,y和z各自在它们自己的列中(例如):
| xs |是的| 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 |
现在,一些绘图函数只获取与我的列(xs,ys,zs)对应的1D数组中的数据。但是,有些需要2D数组(meshgrid)格式。有没有一种简单的方法可以将3个1D阵列转换为3个2D阵列的正确格式?我已经尝试使用numpy.meshgrid,虽然这适用于创建X和Y 2D数组,但我无法找到一种很好的方法来创建相应的Z 2D数组。我设法通过制作一个空白的2D数组并用Z的适当值填充它,但这不是很好。有没有更好的方法来创建Z 2D阵列?
以下是我的尝试(有效)。有没有办法让Z阵列不通过X和Y循环?
def getMeshGrid(dataArray):
"""get 2d coordinate grid and Z values in meshgrid format. requires values in
dataArray to have a rectangular region of x-y 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
提前致谢
答案 0 :(得分:3)
如果您的数据与示例中的数据类似,那么您已经有了一个网格(每对(x,y)的值为z),您只需要重新整形数组:
cols = np.unique(xs).shape[0]
X = xs.reshape(-1, cols)
Y = ys.reshape(-1, cols)
Z = zs.reshape(-1, cols)