LINUX.ORG.RU

Python::массив_для_3D


0

1

Помогите добить скрипт, который должен зачитать из файла координаты площадок 3Д-поверхности и отобразить их. Проблема в том, что не могу придумать как сохранить координаты z (из файла были считаны) в двумерный массив Z. Сейчас в скрипте Z заполнен руками, а нужно в нем были координаты из файла.

$ cat data.txt 
0 1 2
1 0 2
0 -1 2
-1 0 2
$ cat my_figure.py 
#!/usr/bin/python
import pylab
from mpl_toolkits.mplot3d import Axes3D
from numpy import *
import numpy
x,y,z = loadtxt('data.txt', usecols=[0,1,2], unpack=True)
print "data from data.txt = ", x,y,z
X, Y = numpy.meshgrid(x,y)
print "X=", X
print "Y=", Y

Z = numpy.array([ [2.1, 2., 2., 2.],   [2., 2., 2., 2.],  [2., 2., 2., 2.],  [2., 2. ,2., 2.] ])
print "Z=", Z

fig = pylab.figure()
axes = Axes3D(fig)
axes.plot_surface(X, Y, Z)
pylab.show()
$ ./my_figure.py
data from data.txt =  [ 0.  1.  0. -1.] [ 1.  0. -1.  0.] [ 2.  2.  2.  2.]
X= [[ 0.  1.  0. -1.]
 [ 0.  1.  0. -1.]
 [ 0.  1.  0. -1.]
 [ 0.  1.  0. -1.]]
Y= [[ 1.  1.  1.  1.]
 [ 0.  0.  0.  0.]
 [-1. -1. -1. -1.]
 [ 0.  0.  0.  0.]]
Z= [[ 2.1  2.   2.   2. ]
 [ 2.   2.   2.   2. ]
 [ 2.   2.   2.   2. ]
 [ 2.   2.   2.   2. ]]

Ответ на: комментарий от Zhbert

Не мешай ТСа на путь истинный вывести, чтоб он херней не маялся.

baverman ★★★
()

*Мужская скупая*

У Вас, как бы уже всё прекрасно считывается. Может просто выпить чая и подумать?

m4n71k0r
()
Ответ на: комментарий от baverman

четыре точки --- это координаты четырех вершин одной площадки.

в файле сейчас пример одной площадки для тестов.

проблема в том как правильно заполнить двумерный массив Z, координатами из z.

P.S. Не нашел логики работы операторов построения поверхности. Есть пример использвавания команд построения 3Д-поверхности, но подробного описания работы операторов нет.

tmfd
() автор топика
Ответ на: комментарий от tmfd

ну а общем случае координаты в файле расположены так, четыре координаты для первой площадки, четыре координаты для второй, ..., например:

$ cat data.txt 

0 1 2
1 0 2
0 -1 2
-1 0 2

0 1 2
2 2 3
2 1 2
1 0 2

...

могу из сишной программы сбрасывать как-то еще, например четыре точки в одной строке.

так вот, главная проблеме в том. что не знаю, в каком формате кушает данные axes.plot_surface? да и с синтаксисом Питона совсем не знаком.

tmfd
() автор топика
Ответ на: комментарий от tmfd

так вот, главная проблеме в том. что не знаю, в каком формате кушает данные axes.plot_surface?

Ну так и надо было этот вопрос задавать.

Ответ:

1. Не надо дублировать точки в файле.

2. Use matplotlib.mlab.griddata, чтоб построить Z

3. Z может быть разряженным, кстати в твоем исходном примере это так и будет, поэтому в surface_plot надо засунуть нечто Z.filled(...)

4. ....

5. PROFIT!

baverman ★★★
()
Ответ на: комментарий от baverman

s/разряженным/неполным по краям

Попутал слегка.

baverman ★★★
()
Ответ на: комментарий от baverman

1. Не надо дублировать точки в файле.

в файл мне удается сбрасывать рамки их координатами

2. Use matplotlib.mlab.griddata, чтоб построить Z

ткните пожалуйста в конкретный источник информации (url) в котором можно почитать об этой функции

3. Z может быть разряженным

пример искусственный

tmfd
() автор топика
Ответ на: комментарий от tmfd

желательно бы найти четкое описание математики, т.е. как производится интерполяция. Тупо применение matplotlib.mlab.griddata приводит к некоторому неверному результату.

так строит gnuplot http://img522.imageshack.us/img522/4590/testellgnu.png

а так скрипт на Python http://img844.imageshack.us/img844/8301/testellpy.png

tmfd
() автор топика
Ответ на: комментарий от tmfd

желательно бы найти четкое описание математики, т.е. как производится интерполяция

Если в griddata засунуть все данные равномерной прямоугольной сетки, то интерполяции не будет.

так строит gnuplot
а так скрипт на Python

griddata применим только для однозначной функции z(x, y)

Произвольную поверхность не строил — ничего не посоветую.

baverman ★★★
()
Ответ на: комментарий от baverman

Подскажите в каком порядке расположить точки для однозначной функции. Я беру четыре площадки от эллипса и скрипт явно рисует что-то не то.

Логику работы своей-же программы не помню, но помню что для гнуплота сбрасывал площадки. Может подскажите, что изменить в порядке записи точек поверхности в файл. (Кстати, он говорит что одинаковые точки он игнорирует «DuplicatePointWarning: Input data contains duplicate x,y points; some values are ignored.»)

$ cat data.txt 
-3.5453532005 -1.2945206358 2.3019377358
-3.5817236434 -2.3326455834 1.7469796037
-3.2584007852 -2.2306977781 1.7469796037
-3.5453532005 -1.2945206358 2.3019377358

-3.5453532005 -1.2945206358 2.3019377358
-3.2584007852 -2.2306977781 1.7469796037
-3.3659225510 -1.2379438722 2.3019377358
-3.5453532005 -1.2945206358 2.3019377358

-3.3659225510 -1.2379438722 2.3019377358
-3.2584007852 -2.2306977781 1.7469796037
-2.9768526261 -1.7430420618 1.7469796037
-3.3659225510 -1.2379438722 2.3019377358

-3.3659225510 -1.2379438722 2.3019377358
-2.9768526261 -1.7430420618 1.7469796037
-3.2096751106 -0.9673153668 2.3019377358
-3.3659225510 -1.2379438722 2.3019377358

$ cat my_figure.py 
#!/usr/bin/python
import pylab
from mpl_toolkits.mplot3d import Axes3D
from numpy import *
import numpy
import matplotlib
x,y,z = loadtxt('data.txt', usecols=[0,1,2], unpack=True)
X, Y = numpy.meshgrid(x,y)
Z = matplotlib.mlab.griddata(x,y,z,X,Y,interp='nn')
fig = pylab.figure()
axes = Axes3D(fig)
axes.plot_surface(X, Y, Z)
pylab.show()
tmfd
() автор топика
Ответ на: комментарий от tmfd
#!/usr/bin/python 
import pylab 
from mpl_toolkits.mplot3d import Axes3D 
from numpy import * 
import numpy 
import matplotlib 

x,y,z = loadtxt('data.txt', usecols=[0,1,2], unpack=True) 

xi = linspace(min(x), max(x))
yi = linspace(min(y), max(y))

X, Y = numpy.meshgrid(xi, yi) 

Z = matplotlib.mlab.griddata(x, y, z, xi, yi) 
fig = pylab.figure() 
axes = Axes3D(fig) 
axes.plot_surface(X, Y, Z.filled(Z.mean())) 
pylab.show()
baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.