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)