Как превратить набор данных в матрицу и векторы - PullRequest
0 голосов
/ 15 февраля 2019

Предположим, у меня есть этот огромный набор данных в файле .txt, который имеет следующую структуру: первый и второй столбец представляют дискретную двумерную область, а третий столбец представляет значения, рассчитанные для каждой точки дискретных X и Yось.Пример, приведенный ниже

x  y  z
-1 -1 100
-1 0 50
-1 1 100
0 -1 50
0 0 0
0 1 50
1 -1 100
0 -1 50
1 1 100

Это кажется глупым, но я изо всех сил пытался превратить эти данные в векторы и матрицы, такие как X = [-1, 0, 1], Y = [-1, 0,1] и Z = [[100, 50, 100], [50, 0, 50], [100, 50, 100]].Я прошел через многие техники и методы, используя numpy, но не смог сделать это!

В качестве бонуса: превращение этих данных в векторы и матрицы, как я описал, было бы хорошим способом построить их втип 3dscatter ou 3dcountour, использующий matplotlib?

1 Ответ

0 голосов
/ 15 февраля 2019

Чтобы построить точечный график, вам не нужно ничего делать с вашими данными.Просто нанесите столбцы там как они есть.

Чтобы получить значения, которые вы хотите задать в вопросе, вы можете взять уникальные элементы столбца x и y и изменить форму столбца z в соответствии с этими измерениями.

u="""x  y  z
-1 -1 100
-1 0 50
-1 1 100
0 -1 50
0 0 0
0 1 50
1 -1 100
1 0 50
1 1 100"""

import io
import numpy as np

data = np.loadtxt(io.StringIO(u), skiprows=1)

x = np.unique(data[:,0])
y = np.unique(data[:,1])
Z = data[:,2].reshape(len(x), len(y))

print(Z)

print

[[100.  50. 100.]
 [ 50.   0.  50.]
 [100.  50. 100.]]

Разные координаты y теперь расположены вдоль второй оси массива, что довольно необычно для построения графиков с помощью matplotlib.

Следовательно, чтобы получить значения в сетке для построения с контуром, вам нужно сделать одинаковое изменение формы для всех трех столбцов и транспонировать (.T) их.

import matplotlib.pyplot as plt

X = data[:,0].reshape(len(x), len(y)).T
Y = data[:,1].reshape(len(x), len(y)).T
Z = data[:,2].reshape(len(x), len(y)).T

plt.contour(X,Y,Z)
plt.show()

enter image description here

...