преобразование данных Python XYZ для поверхности графика - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу построить трехмерную поверхность в matplotlib из данных xy и z. Для этого мне нужно сделать, казалось бы, простое преобразование данных, но я не уверен, как поступить.

Мои данные x и y являются одинаковыми целыми числами, потому что это будет поверхность изображения. Мои данные представлены в виде массива 512x512. Значения массива - это значения z, а индексы - значения x и y соответственно.

Так что, если arr - это мой массив, arr[x, y] даст мой z. Форма выглядит так:

z z z z ... z (512 columns)
z z z z ... z
z z z z ... z
z z z z ... z
. . . .
. . . .
z z z z (512 rows)

Как мне получить мои данные в виде трех столбцов x, y, z, чтобы я мог составить график поверхности? После преобразования должно выглядеть так:

  x | y | z
  ---------
  0 | 0 | z
  1 | 0 | z
  2 | 0 | z
  . | . | .
  . | . | .
511 | 0 | z
  0 | 1 | z
  1 | 1 | z
  2 | 1 | z
  . | . | .
  . | . | .

Я пытался работать с np.meshgrid и np.flatten, но не могу заставить его работать так, как я хочу. Может быть, есть еще более легкое решение для панд. Или, может быть, я могу даже построить это с исходной формой данных?

Любое предложение приветствуется:)

1 Ответ

0 голосов
/ 09 ноября 2018

Вы бы использовали np.meshgrid так:

# Make coordinate grids
x, y = np.meshgrid(np.arange(arr.shape[0]), np.arange(arr.shape[1]), indexing='ij')
# Flatten grid and data and stack them into a single array
data = np.stack([x.ravel(), y.ravel(), arr.ravel()], axis=1)

Например:

import numpy as np

arr = np.arange(12).reshape((3, 4))
x, y = np.meshgrid(np.arange(arr.shape[0]), np.arange(arr.shape[1]), indexing='ij')
data = np.stack([x.ravel(), y.ravel(), arr.ravel()], axis=1)
print(data)

Выход:

[[ 0  0  0]
 [ 0  1  1]
 [ 0  2  2]
 [ 0  3  3]
 [ 1  0  4]
 [ 1  1  5]
 [ 1  2  6]
 [ 1  3  7]
 [ 2  0  8]
 [ 2  1  9]
 [ 2  2 10]
 [ 2  3 11]]

EDIT:

На самом деле, если вы хотите, чтобы ваш окончательный массив был таким, чтобы значения x сначала увеличивались (как в приведенном вами примере), вы можете сделать это следующим образом:

x, y = np.meshgrid(np.arange(arr.shape[0]), np.arange(arr.shape[1]), indexing='xy')
data = np.stack([x.ravel(), y.ravel(), arr.T.ravel()], axis=1)

В этом случае вы получите:

[[ 0  0  0]
 [ 1  0  4]
 [ 2  0  8]
 [ 0  1  1]
 [ 1  1  5]
 [ 2  1  9]
 [ 0  2  2]
 [ 1  2  6]
 [ 2  2 10]
 [ 0  3  3]
 [ 1  3  7]
 [ 2  3 11]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...