LINUX.ORG.RU

Сообщения dmitry-d67

 

matplotlib обрезать график

Форум — Development

Командой pylab.plot нарисован некоторый график. Этот график должен отображаться без сжатия/растяжения по вертикали и горизотали, что успешно достигается командой pylab.axis('equal'). Но, при этом возникает много пустого место вверху и внизу графика.

Как обрезать не используемое место в итоговом рисунке? xlim и ylim не влияют на результат.

dmitry-d67
()

latex showkeys метка формулы слева?

Форум — Desktop

Как заставить showkeys выставлять названия меток математических формул на левом поле?

 , showkeys

dmitry-d67
()

matplotlib прозрачность в eps

Форум — Development

Нужно нарисовать поле скоростей командой quiver сверху некоторого закрашенного полигона и сохранить рисунок в формате eps. Так в примере, png и на экране смотрятся правильно (стрелки видны), а в eps файле виден только желтый полигон, а стрелок нет.

$ cat test.py 
#!/usr/bin/python
import matplotlib.pylab as p
from numpy import array
p.gca().add_patch(p.Polygon([[-2.2,0],[2.2,0],[2.2,3.5],[-2.2,3.5]],facecolor='yellow',fill=True,alpha=0.2,linewidth=1))
W=array([[0,0,2,1],[1,1,2,-2],[-1,1,-2,4]])
p.quiver(W[:,0],W[:,1],W[:,2],W[:,3])
p.axis('equal')
p.xlim(-2.,2.)
p.ylim(-0.5,3)
p.savefig('ttest.eps')
p.savefig('ttest.png',dpi=600)
p.show()

p.s. кстати, если нарисую стрелку командой arrow (например, p.arrow(0,2,0,-1)) то все в порядке - в eps файле все видно. Но мне нужно рисовать quiver.

 , ,

dmitry-d67
()

иключить деление на ноль

Форум — Development

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

$ cat ttest.py 
#!/usr/bin/python
import numpy 
import sympy
x,y=sympy.symbols('x y')
G=1./(x-y)
F=sympy.diff(G,x)
sympy.pprint(F)
def FunWithoutDivZero(sFunct=None):
    def lmbd(a,b):
        result=numpy.zeros_like(a-b)
        gd=(a!=b)
        #a[numpy.logical_not(gd)]+=1.
        result[gd]=sympy.lambdify((x,y),sFunct,modules='numpy')(a,b)[gd]
        return result
    return lmbd 
KF=FunWithoutDivZero(sFunct=F)
t=numpy.array([1.,2.,3.,4.,5.])
u=numpy.array([1.,2.,3.,4.,5.]).reshape(-1,1)
print KF(t,u)
$ ./ttest.py 
   -1   
────────
       2
(x - y) 
Warning: divide by zero encountered in true_divide
[[ 0.         -1.         -0.25       -0.11111111 -0.0625    ]
 [-1.          0.         -1.         -0.25       -0.11111111]
 [-0.25       -1.          0.         -1.         -0.25      ]
 [-0.11111111 -0.25       -1.          0.         -1.        ]
 [-0.0625     -0.11111111 -0.25       -1.          0.        ]]

p.s. если бы можно было определить символьную функцию как G= при x!=y вернуть 1/(x-y), а при x=y вернуть 0.0, то все было бы ok.

p.s. 2 поэлементное решение слишком медленное (работает в десятки раз медлее):

def withoutZero(sFunct=None,eps=0.0001):
    def lmbd(a,b):
        if numpy.abs(a-b)>eps: 
            return sympy.lambdify((x,y),sFunct,modules='numpy')(a,b) 
        else: return 0.0
    return numpy.vectorize(lmbd)

 

dmitry-d67
()

передать условие в lambdify функцию

Форум — Development

Некоторая функция w конструируется путем дифференцирования (как она выглядит не нужно знать, но пользоваться этой функцией нужно). Известно что при условии модуль (t-u) > epsilon функцией можно пользоваться, при модуль (t-u) > epsilon --- нет. Как бы передать это условие в «конструктор» функции ? В примере ниже, результат правильный, но тратится время на бесполезное деление на ноль и вылетает предупреждение.

$ cat  ttest.py 
#!/usr/bin/python
import sympy
import numpy
x,y=sympy.symbols('x y')
f=1/(x-y)
v=sympy.diff(f,x)
w=sympy.lambdify((x,y),v)
t=numpy.array([1,2,3,4,5]).reshape(-1,1)
u=numpy.array([1,3]).reshape(1,-1)
plusIndex=numpy.abs(t-u)>0.00001
R=numpy.ones((5,2),dtype='d')
R[plusIndex]=w(t,u)[plusIndex]
print R


$ ./ttest.py 
Warning: divide by zero encountered in true_divide
[[ 1.         -0.25      ]
 [-1.         -1.        ]
 [-0.25        1.        ]
 [-0.11111111 -1.        ]
 [-0.0625     -0.25      ]]

 , ,

dmitry-d67
()

sympy.funct -> numpy->funct автоматом

Форум — Development

Нужно путем дифференцирования, с использованием sympy, получить функцию, а затем эту функцию использовать в расчетах. Причем параметрами функции будут выступать numpy матрицы в общем случае. Возникает проблема при использовании sympy функций (в примере ниже с логарифмом log, причем в этом примере log даже не попадает результат диференцирования). Что можно сделать, чтобы dFx принимала numpy - матрицы или вектора?

$ cat simplytest.py 
#!/usr/bin/python
import numpy
import sympy
x,y=sympy.symbols('x y')
F=x**2+sympy.log(y*x)
dFx=sympy.diff(F,x)
sympy.pprint(dFx)
funct_dFx=sympy.lambdify((x,y),F)
print funct_dFx(1,1)

def diffFx(x):
    return funct_dFx(x[0].reshape(-1,1),x[1].reshape(1,-1))

o=numpy.linspace(0,numpy.pi,4)
vect_x=numpy.array([numpy.cos(o),numpy.sin(o)])
print diffFx(vect_x)

$ ./simplytest.py 
      1
2⋅x + ─
      x
1.0
Traceback (most recent call last):
  File "./simplytest.py", line 16, in <module>
    print diffFx(vect_x)
  File "./simplytest.py", line 12, in diffFx
    return funct_dFx(x[0].reshape(-1,1),x[1].reshape(1,-1))
  File "<string>", line 1, in <lambda>
TypeError: only length-1 arrays can be converted to Python scalars

P.S. если удалить log, то все ok - пробовал разные выражения, но без мат. функций (типа F=x**2+y/x). но мне нужно log и другие функции.

 , ,

dmitry-d67
()

установка pycuda

Форум — Admin

Пытаюсь установить PyCUDA по вот этой инструкции http://wiki.tiker.net/PyCuda/Installation/Linux/Ubuntu. Подскажите, что можно сделать:

$ ./configure.py --cuda-root=/usr/local/cuda --cudadrv-lib-dir=/usr/lib --boost-inc-dir=/usr/include --boost-lib-dir=/usr/lib --boost-python-libname=boost_python-mt --boost-thread-libname=boost_thread-mt --no-use-shipped-boost
*** CUDA_ROOT not set, and nvcc not in path. Giving up.

$ sudo ./configure.py --cuda-root=/usr/local/cuda --cudadrv-lib-dir=/usr/lib --boost-inc-dir=/usr/include --boost-lib-dir=/usr/lib --boost-python-libname=boost_python-mt --boost-thread-libname=boost_thread-mt --no-use-shipped-boost
*** CUDA_ROOT not set, and nvcc not in path. Giving up.

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/cuda/lib64:/usr/local/cuda/lib

$ export CUDA_ROOT=/usr/local/cude

$ echo $CUDA_ROOT 
/usr/local/cude

$ sudo ./configure.py --cuda-root=/usr/local/cuda --cudadrv-lib-dir=/usr/lib --boost-inc-dir=/usr/include --boost-lib-dir=/usr/lib --boost-python-libname=boost_python-mt --boost-thread-libname=boost_thread-mt --no-use-shipped-boost
*** CUDA_ROOT not set, and nvcc not in path. Giving up.

$ ls /usr/local/cuda/
bin  doc  extras  include  lib  lib64  libnvvp  nvvm  open64  src  tools

 

dmitry-d67
()

сделать reshape матрице за один раз

Форум — Development

Можно ли преобразовать X как показано ниже, выполнив один раз оператор reshape? Нужно первый array, возвращаемый mgrid, вытянуть в один столбец, и со вторым проделать тоже, получив в результате матрицу из двух столбцов.

>>> X=mgrid[0:3,0:3]
>>> X
array([[[0, 0, 0],
        [1, 1, 1],
        [2, 2, 2]],

       [[0, 1, 2],
        [0, 1, 2],
        [0, 1, 2]]])

>>> X=c_[ X[0].reshape(-1,1), X[1].reshape(-1,) ]
>>> X
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])


dmitry-d67
()

работа с numpy-массивами

Форум — Development

Имеется массив x. Нужно найти все элементы массива x, удовлетворяющие условию (x-i)<2 для x от 1 до N. Ниже три варианта решения. Можно ли сделать быстрее?

x=numpy.array([1.1,2.2,3.3,4.4])
N=100000
t1=time.clock()
y=[]
for i in numpy.linspace(0,1,N):
    y=numpy.r_[ y, x[(x-i)<2] ]
t2=time.clock(); print t2-t1
t1=time.clock()
z=numpy.concatenate(map(lambda i: x[(x-i)<2],numpy.linspace(0,1,N)))
t2=time.clock(); print t2-t1
t1=time.clock()
i=numpy.linspace(0,1,N)
f=numpy.array([ item for item  in x if filter(lambda i_n:item-i_n<2, i) ])
t2=time.clock(); print t2-t1

$ ./test.py 
71.44
0.92
0.69
dmitry-d67
()

в pylab оторазить sympy.latex-функцию

Форум — Development

попытка отобразить в окне pylab-а sympy-выражение, содержащее функцию, приводит к ошибке. Можно ее устранить?

import sympy,pylab
x=sympy.Symbol('x')
t=sympy.sin(x)
pylab.xticks([])
pylab.yticks([])
pylab.text(0.2,0.5,sympy.latex(t),size=40)
pylab. show()

 raise ParseFatalException(msg + "\n" + s)
ParseFatalException: Expected end of math '$'
$\operatorname{sin}\left(x\right)$ (at char 0), (line:1, col:1)

нужно либо заставить sympy генереровать sin, либо pylab понимать operatorname.

dmitry-d67
()

цветовое оформление виджета Qt4

Форум — Development

Как в Qt4 можно разукрасить виджеты. Верен ли вот этот алгоритм:

QPalette palette;
palette = lcdnumber2->palette();
palett.setColor(QPalette::Window, QColor(0,225,255));
lcdnumber2->setPalette(palete);
? Проблема в том, что если виджет расположен на Layout, то цвет не меняется. кроме Window были испробованы все константы со страницы qpalette.html (nokia.com)

dmitry-d67
()

gmsh поверхность с нормалями во вне

Форум — Desktop

Как в gmsh заставить после триангуляции нормали смотреть наружу?

например, генерируем прямоугольный параллепипед

c = 0.2;
Point(1) = {0, 0, 0, c};
Point(2) = {0, 1, 0, c};
Point(3) = {1, 1, 0, c};
Point(4) = {1, 0, 0, c};
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3,4};
Line(4) = {4,1};
Line Loop(1) = {1,2,3,4};
Plane Surface(1) = {1};
out[] = Extrude{0,0,2 }{ Surface{1}; };
# gmsh -2 "$geoname" -o "$stlname" 1>/dev/null

квадрат в плоскости xOy (Plane Surface(1)) нарисован так, что нормаль автоматом (как я понял подчиняется правому винту) направлена во вне параллепипеда (против оси z). Для треугольников, образующих все остальные грани нормаль будет направлена внутрь параллепипида.

dmitry-d67
()

распарсить stl-файл (Питон)

Форум — Development

stl файл хранит координаты вершин площадок и нормали к ним:

$ head -15 test1.stl 
solid Created by Gmsh
facet normal 0 -0 -1
  outer loop
    vertex -2.74257 -1.88725 0
    vertex -1 -3.8 0
    vertex -3 -4.4 0
  endloop
endfacet
facet normal 0 0 -1
  outer loop
    vertex -5 -5.55112e-12 0
    vertex -2.74257 -1.88725 0
    vertex -5 -2.5 0
  endloop
endfacet
...

помогите распарсить файл по шаблону и превратить в массив вещественных чисел (N,12), в котором храняться 9-ть координат вершин и 3 компоненты нормали. Пока удалось распознавать записи facet ... endfacet. Но извлечь их из файла и записать в массив не удается.

#!/usr/bin/python
from pyparsing import *
d=Word(nums+".-e")
rec="facet normal"+d+d+d+"outer loop"+"vertex"+d+d+d+"vertex"+d+d+d+"vertex"+d+d+d+"end loop"+"endfacet"

print rec.parseString("facet normal 1 0 0 outer loop vertex 11.2e-10 2.1. -1.1 vertex 11.1 0.0 -1.1 vertex -1 -1 -1 end loop endfacet")
print "* end TEST"

#datafile=OneOrMore(Group(rec))
#infile=open('test1.stl','r')
#datafile.parseString(infile)

#data=open('test1.stl','r').readlines()
#print data
#print rec.parseString(data)

dmitry-d67
()

возможности gmsh для 3D поверхностей

Форум — Development

ищу бесплатную программку для построения сеток для трехмерных поверхностей (интересует разбиение на площадки именно поверхности, а не всего объемного тела). Пока склоняюсь к gmsh.

Вопросы (для тех кто работал с этой программой):

1. кнопка Mesh/2d генерирует именно поверхностную сетку ?

2. можно ли формат mesh переконвертировать в raw ? если можно, то как или чем?

dmitry-d67
()

latex проблема с цитированием кода

Форум — Development

Имеется такая собственная команда. Нужно в тексте, передаваемом в myobject включить цитирование кода. verbatim и verb почему-то вызывает ошибку.

\newcommand{\myobject}[2]{
\begin{minipage}[t][120mm]{142mm}
    \begin{center}
          \noindent
           {\it Заголовок } \\[1.5mm]
           ...
   \end{center}
   \begin{enumerate}
       \item{#1}
       \item{#2}
   \end{enumerate}
\end{minipage}
}


почему-то такой вызов приводит к ошибке
Код:
\myobject{1}{\verb|2|}
! LaTeX Error: \verb illegal in command argument.

а такой вызов нет
Код:
\myobject{1}{2}

Как устранить ошибку?

p.s. Использование listing тоже происходит с проблемами.

\myobject{
текст
\begin{lstlisting}
...
\end{lstlisting}
}{
1}

! Argument of \lst@next has an extra }.
<inserted text>
                \par

конструкция lstlisting без проблем работает вне myobject.

dmitry-d67
()

RSS подписка на новые темы