matplotlib从1D阵列创建2D数组 - 有更好的方法吗?

时间:2014-01-25 14:59:01

标签: python arrays numpy matplotlib

我正在尝试使用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

提前致谢

1 个答案:

答案 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)