Matplotlib создает 2D-массивы из 1D-массивов - есть ли лучший способ?

Я пытаюсь визуализировать некоторые данные, которые у меня есть, используя контурные диаграммы matplotlibs, графики поверхности и каркасные графики.

мои необработанные данные представлены в виде пустого массива с x,y и z каждый в своем собственном столбце (например):

| хз | да | зс |
| --- | --- | ---- |
| 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). Однако для некоторых требуется формат двумерного массива (сетка). Есть ли простой способ конвертировать из 3 1D массивов в правильный формат 3 2D массивов? Я попытался использовать numpy.meshgrid и, хотя это работает для создания двумерных массивов X и Y, я не могу найти хороший способ создания соответствующего массива 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 ответ

Решение

Если ваши данные похожи на те, что вы дали в примере, у вас уже есть сетка (у вас есть значение z для каждой пары (x,y)), и вам нужно только изменить форму массивов:

cols = np.unique(xs).shape[0]
X = xs.reshape(-1, cols)
Y = ys.reshape(-1, cols)
Z = zs.reshape(-1, cols)
Другие вопросы по тегам