.

Питон, Информация.

Виктор Кон,   1706-0507 (2020),   kohnvict@yandex.ru
.

Внимание !! Названия разделов можно кликать. Для возврата к Содержанию нажимайте клавиши Ctrl+Home.

Содержание

Вместо Ведения
Библиотека функций vkohnpy.stf
Библиотека функций vkohnpy.spf

Вместо Ведения

Программировать в Питоне, как и на любом другом языке программирования, можно разными способами. Один из них, который почему-то очень навязывается именно в Питоне, состоит в использовании командной строки. Это самый простой способ в обучении -- написал команду, она выполнилась, сразу видна реакция той среды, с которой происходит общение. И так шаг за шагом. При обучении хорошо, а в работе плохо, очень медленно. Второй способ -- писать текст в файле и запускать файл на исполнение. Так уже можно написать что-то сложное, но не очень. Иначе файл будет иметь огромные размеры и работать с ним будет неудобно. Третий способ -- выделять готовые куски кода в отдельные файлы, которые можно даже не смотреть. Надо хорошо понимать как их использовать и все.

Есть еще четвертый способ -- писать собственный язык программирования на базе Питона. Это как бы более развитый и более удобный для использования третий способ. Весь код записан в файлах и вызывается новыми командами, которые придумал пользователь. Эти команды используют готовый код. Главная программа делает единственную работу -- устанавливает связь между новыми командами и написанным кодом. Для этого способа надо иметь очень много готового написанного пользователем кода, иначе он не будет эффективен.

В этой статье представлен третий способ, а именно -- использовать функции из собственной библиотеки. Библиотеку я только начал создавать и в ней еще не так много функций. Но это временное явление, очень скоро их будет больше. Вся библиотека пока состоит из двух файлов. Имея в виду будущее развитие системы, она сразу выделена в отдельную папку с названием (vkohnpy). Эту папку можно скачать, кликая тут , и ее надо скопировать в папку, где находится файл вашей программы. Как пользоваться библиотекой написано ниже.

Библиотека функций vkohnpy.stf

Здесь рассмотрены следующие функции:

putd ____ -- запись данных типа float в файл.
getd ____ -- чтение данных типа float из файла.
pffun1 __ -- график серии одномерных функций от общего аргумента, вариант 1.
pffun2 __ -- график серии одномерных функций от общего аргумента, вариант 2.
cmfun2D -- график двумерной функции в виде карты цветов.
fft ______-- одномерный интеграл Фурье (через БПФ -- быстрое преобразование Фурье).
fft2 _____-- двумерный интеграл Фурье (через БПФ -- быстрое преобразование Фурье).
ifft ______-- обратный одномерный интеграл Фурье (через БПФ -- быстрое преобразование Фурье).
ifft2 _____-- обратный двумерный интеграл Фурье (через БПФ -- быстрое преобразование Фурье).
strop ____-- операции преобразования текстовых строк.
rfcg _____-- одномерная свертка реальной функции с функцией Гаусса.
rfcg2 ____-- двумерная свертка реальной функции с функцией Гаусса.
mmi ____ -- интерполяция двумерного массива.
cratt ____ -- преобразование реального массива в текст для записи в файл.

(stf.py) -- это первый файл в папке (vkohnpy). Первый не по алфавиту а по времени открытия. Он предназначен для записи стандартных функций, которые нужны всем. Чтобы можно было им пользоваться в вашей программе надо записать в самом начале такую строку

import vkohnpy.stf as vkst

Этим самым мы импортируем код из файла в программу аналогично коду из дистрибутива самого Питона и дополнительно установленных пакетов. Дополнительно вводится сокращение для удобства записи. В этом файле записано 13 функций.

--- putd --- эта функция вызывается следующим образом

vkst.putd(tit,da)

У нее два аргумента. Первый аргумент -- это строка текста. Она может быть любой, функция использует только первые 5 символов этой строки в качестве имени файла. Назначение этой функции -- записать числовой массив в файл. Числовой массив -- это второй аргумент. Он может иметь любую структуру числового файла пакета numpy. Питон про это знает. И вот этот массив, как есть, то есть в компьютерном коде, записывается в файл с именем из первых 5 символов первого аргумента и расширением (.npy). Он записывается в папку с названием (data) внутри папки вашей программы. Если такой папки нет, то функция ее создает. Все очень просто, записывать данные в файл бывает весьма полезно. Написали команду и не надо ни о чем думать. Все будет сделано в лучшем виде.

--- getd --- эта функция вызывается следующим образом

da = vkst.getd(tit)

У нее, как раз обратная функция. Она прочитывает файл с именем в первых пяти символах аргумента и расширением (.npy) в папке (data) в массив da. Чтобы команда правильно работала файл надо сначала записать. Если папки не существует, то она записывает массив из одного элемента с нулевым значением. Если папка существует, но файл не существует, она выдает сообщение об ошибке в терминал. Это делает сам Питон. Пока так.

--- pffun1 --- эта функция вызывается следующим образом

vkst.pffun1(xa,ya,fw,fh,tit,K)

Она рисует график одномерных функций (plain figure) по массиву значений аргумента (xa) и функций (ya). Дополнительно нужно указать ширину окна графика в аргументе (fw), например 10, высоту окна графика в аргументе (fh), например, 6, заголовок графика в аргументе (tit) и ключ (K). Снова первые 5 символов заголовка используются для имени файла, в который записывается график с расширением (.png) в папке (pic) внутри папки вашей программы. Если папки нет, то она создается. График всегда записывается в файл. А вот на экране показывается только в том случае, если ключ K не равен 0. Если он равен 0, то на экране график не показывается. Это удобно при автоматической работе в цикле.

Следует помнить, что если xa -- это массив размером n точек, то массив ya может быть массивом с таким же размером, а может быть двумерным массивом (m,n). Тогда он описывает m разных функций от одного и того же аргумента. Например, действительную и мнимую части комплексной функции. Все другие параметры графика определены и не меняются. Если нужен другой график, то можно посмотреть код функции и попробовать его изменить, или сделать новую функцию. Удобство функций такого типа в том, что можно один раз оптимально настроить все параметры и больше о них не думать.

--- pffun2 --- эта функция вызывается следующим образом

vkst.pffun2(xa,ya,lwa,ca,fw,fh,tit,K)

Эта функция является расширенным вариантом предыдущей функции. Она делает то же самое, но у нее на два аргумента больше. Дополнительно есть аргументы (lwa) и (ca). Это списки, первый из чисел, второй из текстов. Если функция рисует несколько кривых, то есть массив (ya) двумерный, то список (lwa) указывает толщину линий для каждой функции, а список (ca) указывает цвет, которым рисуется каждая функция, в виде текстовой переменной типа ('#ff0000'). Здесь символ # указывает на 16-тиричную систему чисел и каждые два разряда описывают доли цветов красного, зеленого и синего в диапазоне от 0 до 255. В предыдущей функции эти параметры используются по умолчанию. Все остальное точно так же, как и в предыдущей функции

Дело в том, что иногда важно контролировать цвет функций. Один пример: в пакете Matplotlib очень сложно контролировать вертикальную ось. Она формируется автоматически по значениям функции. Если нужно иметь фиксированную ось, то можно добавить еще две функции с минимальным и максимальным значением, которое необходимо иметь. А сами эти функции рисовать белым цветом и их не будет видно, однако вертикальную ось они сформируют как надо. Печально, что приходится использовать такие, скажем прямо некрасивые приемы, но лучше так, чем никак. А автору пакета Matplotlib отдельный привет.

--- cmfun2D --- эта функция вызывается следующим образом

vkst.cmfun2D(xa,ya,za,fw,fh,tit,K)

Она рисует цветную карту распределения двумерной функции (color map) по массиву значений первого аргумента (xa), второго аргумента (ya) и функции (za). Как и в третьей функции нужно указать ширину окна графика в аргументе (fw), например 7.58, высоту окна графика в аргументе (fh), например, 6, заголовок графика в аргументе (tit) и ключ (K). Снова первые 5 символов заголовка используются для имени файла, в который записывается график с расширением (.png) в папке (pic) внутри папки вашей программы. Если папки нет, то она создается. График всегда записывается в файл. А вот на экране показывается только в том случае, если ключ K не равен 0. Если он равен 0, то на экране график не показывается. Это удобно при автоматической работе в цикле.

Здесь дела обстоят несколько сложнее. Во-первых, функция использует собственную карту цветов, которой нет в Питоне. Во-вторых, указываются общие размеры графика, а не размеры карты цветов. И можно очень просто испортить аспектное отношение, то есть отношение высоты к ширине области карты. А иногда желательно, чтобы это отношение соответствовало отношению реальных размеров области. Например, для квадратной области было квадратным. Выше указаны как раз размеры окна графика для квадратной области на моем компьютере. К сожалению, для каждого компьютера возможно придется эти размеры подбирать эмпирическим путем.

--- fft --- эта функция выполняет преобразование Фурье одномерной комплексной функции. Она вызывается следующим образом

fa = vkst.fft(fa,d,n)

Она использует процедуру Быстрого Преобразования Фурье (БПФ) пакета numpy, но с определенной модификацией, про которую я расскажу ниже. Итак, предполагается, что функция описывается комплексным массивом fa, в котором находятся N точек, причем N является целой степенью числа 2. Например, 128, 256, 512, 1024 и так далее. Эти точки расставлены в реальном пространстве x с шагом d (второй аргумент) если n (третий аргумент) равно 1. Тогда функция вычисляет преобразование Фурье в тот же самый массив или в другой массив cтандартным способом, используя всю систему точек. Число точек в массиве будет N, то же самое, а вот шаг будет равен dq = 2пи/(d*N).

Но есть и другой вариант, когда n > 1. В этом случае n тоже должно быть равно целой степени числа 2. То есть может быть равно 2, 4, 8 и так далее. Предполагается, что функция определена на сетке из N точек, но с шагом d = d0/sqrt(n), где теперь d0 -- шаг, который был при n = 1. Шаг меньше, значит функция определена более подробно и точно. Функция формирует новый массив с числом точек N*n, в котором N центральных точек содержит значения функции, то есть массива fa, а остальные точки заполняются нулями. И вот для такого массива делается преобразование Фурье. Результат получается на системе точек с числом N*n и с шагом dq = 2пи/(d*N*n) = dq0/sqrt(n). То есть шаг в обратном пространстве тоже меньше и функция известна лучше. Затем из этого массива вынимается центральная часть и она, как раз представляет результат работы функции.

Такой трюк приходится делать по той причине, что многие функции подобны функции Гаусса. А для функции Гаусса произведение полуширины кривой в прямом (wx) и обратном (wq) пространствах равно 5.5 и не зависит от числа точек. С другой стороны, произведение размеров расчетной области при использовании процедуры БПФ в прямом пространстве (X) и обратном пространстве (Q) равно 2пи*N, то есть зависит от числа точек. При большом числе точек функции в обоих пространствах заполняют только малую центральную часть расчетной области, а вся остальная область равна нулю. И если не считать там функцию, а просто записать нули, то расчет проходит быстрее с тем же результатом.

--- fft2 --- эта функция выполняет преобразование Фурье двумерной комплексной функции. Она вызывается следующим образом

fa = vkst.fft2(fa,d1,d2,n1,n2)

Она использует пятую функцию. В ней предполагается, что двумерная комплексная функция определена на прямоугольной сетке с разными шагами по осям X и Y, и в расчете используются разные расширения n1 и n2. Требования к функции и параметрам те же самые, как и в предыдущей функции, но в двух измерениях. В частном случае эта процедура работает и с одномерной функцией, но для этого проще использовать предыдущую процедуру.

--- ifft --- эта функция выполняет обратное преобразование Фурье одномерной комплексной функции. Она вызывается следующим образом

fa = vkst.ifft(fa,d,n)

Эта функция работает точно так же, как и пятая функция. Отличие только в том, что массив в аргументе должен быть определен в обратном пространстве, а результат получается в прямом пространстве. И еще одно отличие в том, что шаг нужно указывать в прямом пространстве, как и в пятой функции. Так просто удобнее. Иногда бывает необходимо определить функцию в прямом пространстве, затем сделать прямое, а потом обратное преобразование Фуье. И шаг в обратном пространстве при этом считать совсем не обязательно.

--- ifft2 --- эта функция выполняет обратное преобразование Фурье двумерной комплексной функции. Она вызывается следующим образом

fa = vkst.ifft2(fa,d1,d2,n1,n2)

Она использует седьмую функцию. В ней предполагается, что двумерная комплексная функция определена на прямоугольной сетке с разными шагами по осям X и Y, и в расчете используются разные расширения n1 и n2. Требования к функции и параметрам те же самые, как и в седьмой функции, но в двух измерениях. В частном случае эта процедура работает и с одномерной функцией, но для этого проще использовать предыдущую процедуру.

--- strop --- эта функция выполняет различные преобразования строки символов, которые часто приходится делать при обработке входных данных программы. Она вызывается следующим образом

tt = vkst.strop(txt,n)

У нее первый аргумент -- это строка символов, которая обрабатывается, второй аргумент -- это номер операции. Она возвращает новую строку символов, уже после обработки. Пока имеется 4 операции. (1) Первая операция убирает в строке все пробелы в начале и в конце, и выдает середину, в которой, в принципе тоже могут пробелы. (2) Вторая операция делает примерно такую же работу, но чуть иначе. Она убирает все пробелы в начале, затем выделает текст без пробелов и его возвращает. То есть у такой строки уже не может быть пробелов. Необходимость в таких операциях вызвана тем, что пробелы плохо видны, и иногда они бывают во входных данных и даже специально делаются для удобства чтения. Но программе они не нужны и их надо убирать.

(3) Третья операция делает более строгую работу. Она проверяет строку на наличие в ней символов, отличных от числа, то есть от 0,...,9. Если других символов нет, то возвращает 1, а если есть, то 0. Это необходимо для избежания ошибки при конвертировании текста в числовую переменную. Наконец, (4) четвертая операция удаляет из текста все нули слева, то есть, например, 001 превращает в 1. К сожалению Питон не любит нулей слева и указывает на ошибку при конвертировании текста в число. Так что это тоже часто необходимая операция.

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

rfa = vkst.rfcg(rfa,sig,n)

Реальная функция задается массивом rfa, причем программа сама определяет размер массива. Функция Гаусса задается параметром сигма (второй аргумент), который измеряется в шагах сетки, на которой определена реальная функция. Функция возвращает свертку реальной функции и функции Гаусса на той же сетке. Расчет проводится методом БПФ (быстрого преобразования Фурье) с помощью функций fft(), ifft() данной библиотеки. Третий параметр -- это расширитель сетки, который используют указанные функции. Не забывайте при изменении шага сетки переопределять параметр сигма. Лучше всего, если программа будет его вычислять.

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

rfa = vkst.rfcg2(rfa,sig1,sig2,n1,n2)

Реальная функция задается массивом rfa, причем программа сама определяет как размерность, так и размер массива по разным направлениям. В случае одномерной функции она проводит расчет используя первые из двух параметров. Функция Гаусса задается двумя параметрами сигма (второй и третий аргументы), которые измеряются в шагах сетки, на которой определена реальная функция. Функция возвращает свертку двумерной реальной функции и двумерной функции Гаусса на той же сетке. Расчет проводится методом БПФ (быстрого преобразования Фурье) с помощью предыдущей операции. Последние два параметра -- это расширители сетки, которые использует указанная функция. Не забывайте при изменении шагов сетки переопределять параметры сигма. Лучше всего, если программа будет их вычислять.

--- mmi --- эта функция выполняет интерполяцию двумерного массива с одной системы точек на другую систему точек. Она вызывается следующим образом

fna = vkst.mmi(x2a,y2a,x1a,y1a,fa)

Здесь x2a -- массив значений аргумента по оси х, то есть вдоль строк матрицы, для результата, y2a -- то же самое по оси y, то есть вдоль столбцов матрицы, x1a, y1a -- массивы значений аргумента, на которых определена исходная матрица fa. В результате интерполяции процедура вычисляет значения матрицы на массивах аргументов x2a, y2a, которые отличаются от исходных массивов аргументов x1a, y1a. Эта функция может работать и с одномерным массивом fa. В этом случае используются только x2a и x1a массивы аргументов. Вторые массивы можно задать равными первым, они использоваться не будут. Функция использует процедуру np.interp(x2a,x1a,fa) одномерной интерполяции пакета numpy.

Функция такого типа может оказаться полезной при расчете двумерных зависимостей. Дело в том, что часто условия расчета требуют много точек, а показать их на графике весьма сложно, да и файлы получаются очень большие. Выбирать точки через одну или две не всегда удается. Процедура интерполяции, хоть и считает дольше, но удобна для программиста и позволяет получить результат на любой заранее заданной сетке точек. Такие же аргументы применимы и в случае одномерных зависимостей.

--- cratt --- эта функция выполняет преобразование реального массива в текст для записи в файл. Она вызывается следующим образом

txt = vkst.cratt(ra,key)

Здесь ra -- реальный массив, key -- ключ операции. Он может быть равен 0 или 1. Процедура определяет максимальное значения массива ra. Затем если key = 0, минимальное значение устанавливается равным 0, а если key = 1, то определяется еще и минимальное значение. После этого интервал значений массива ra преобразуется в интервал от 0 до 9999 и определяется новый массив целых чисел на этом интервале. Новый массив преобразуется в текстовую строку, у которой каждое число записывается в 5 разрядов, лишние заполняются пробелами слева и через каждые 20 чисел ставится признак конца строки. В конце записываются минимальное и максимальное значения исходного массива ra и число точек. И эта текстовая строка выдается в переменную txt.

Далее эту строку можно либо распечатать, либо записать в файл. Значения в файле можно использовать для создания графика функции в другой программе, например на языке постскрипт или в расчетах. Знание минимального и максимального значений позволяет конвертировать записанные целые числа обратно в исходные значения. Точности 4-х разрядов вполне хватает для графики.

Библиотека функций vkohnpy.spf

Здесь рассмотрены функции wfp, wfp2, wfpff, wfpff2.

(spf.py) -- это второй файл в папке (vkohnpy). Он предназначен для записи специальных функций, которые нужны не всем. По этой причине эти функции выделены в отдельный файл. Чтобы можно было им пользоваться в вашей программе надо записать в самом начале такую строку

import vkohnpy.spf as vksp

Этим самым мы импортируем код из файла в программу аналогично коду из дистрибутива самого Питона и дополнительно установленных пакетов. Дополнительно вводится сокращение для удобства записи. В этом файле пока записаны 4 функция.

--- wfp --- эта функцию вызывается следующим образом

wfa = vksp.wfp(wfa,p,n)

Имя функции составлено из первых букв трех английских слов Wave Function Propagation. Функция имеет отношение к области физики под названием рентгеновская оптика. Она выполняет расчет изменения одномерной волновой функции рентгеновского излучения при прохождении по пустому пространству на некоторое расстояния. Расчет делается методом Гюйгенса-Френеля. Она имеет три аргумента. Первый аргумент -- это комплексный массив самой функции, которая задана на стандартной системе точек. Размер массива программа знает. Второй аргумент -- это массив параметров из трех значений. Первое значение --это энергия фотонов Е в кэв, второе значение -- расстояние z, на которое переносится функция излучения в см, третье значение d -- шаг сетки точек на котором определена функция в мкм. Массив можно определить простым списком так p = [1,2,3] или как массив numpy так p = np.array([1,2,3]), результат от этого не изменится. Третье значение -- расширитель сетки.

Функция использует в расчете процедуру БПФ (быстрого преобразования Фурье). По этой причине массив wfa должен быть определен на системе точек с числом N равным целой степени числа 2. То же самое относится к третьему параметру n. Нужно помнить, что если волновая функция определена с шагом d0 при n = 1, то оптимально хорошие результаты получатся при n > 1 если шаг будет равен d = d0/sqrt(n). То есть при n = 4 шаг должен быть в два раза меньше при том же числе точек. Этот прием позволяет более детально прописать локальную функцию, которая имеет размер меньше, чем размер расчетной сетки. Так всегда бывает при больших значениях N. Но это требование не строгое. Можно пробовать любое значение шага. Если после тестирования на известных примерах все будет правильно, то и удача вам в руки.

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

wfa = vksp.wfp2(wfa,p,n1,n2)

Здесь комплексный массив волновой функции wfa представляет собой матрицу, которая по каждому измерению должна удовлетворять условиям, сформулированным при описании первой функции. Массив параметров p имеет 4 элемента. Первые два -- те же самые, а вторые два -- шаги сетки по направлениям X и Y. Соответственно и расширителей сетки в 2 раза больше. Расширители сетки весьма сокращают время расчета в сочетании с возможностью получать качественные результаты именно в двумерном случае. При разумном использовании они весьма полезны. Программа может считать и одномерную волновую функцию, в этом случае она просто использует предыдущую процедуру.

--- wfpff --- эта функция делает такую же работу, как и первая, но в приближении дальнего поля. Она вызывается следующим образом

wfa = vksp.wfpff(wfa,p,n)

Если первая функция выдает результат на сетке с таким же точно числом точек и таким же шагом, то эта функция выдает результат на сетке с таким же точно числом точек, но с другим шагом. Шаг новой сетки вычисляется по формуле d1 = w*z/(d*N*n), где w = 12.3984/E -- длина волны излучения в ангстремах, z -- расстояние в см, d -- шаг исходной сетки, N -- число точек, на котором определена волновая функция и результат, n -- расширитель сетки (третий аргумент). Расчет по этой функции разумно проводить только для достаточно большого значения z, иначе сетка получится с очень мелким шагом и объект может не уместиться в размер области. На очень больших расстояниях, наоборот шаг может оказаться крупным и бывает удобно использовать расширитель сетки n со значением 4, 8 и так далее. Все остальное в этой процедуре аналогично первой процедуре, так что нужно просто прочитать ее описание.

--- wfpff2 --- эта функция делает такую же работу, как и третья, но для двумерной волновой функции. Она вызывается следующим образом

wfa = vksp.wfpff2(wfa,p,n1,n2)

Она использует третью функцию, а ее аргументы точно такие же, как у второй функции. Соответственно шаги новой сетки будут такие же, как в случае третьей функции, но по двум измерениям, а параметры такие же как у второй функции. Если волновая функция одномерная, она тоже выполняет расчет, просто вызывая третью функцию, а четвертый параметр массива p не используется.

То есть если кого-то интересует универсальность, то можно всегда использовать только вторую и четвертую функции, как для одномерной, так и для двумерной функции. Процедуры для одномерной функции в этом случае просто являются вспомогательными, так как вторая и четвертая функции их используют.

.



  Внимание! Сайт оптимизирован под браузер Google Chrome.