Почта
Чат
Диск
     

Основы языка Python

Язык программирования Python был создан голландцем Гвидо ван Россумом в 1990 году. Это скриптовый язык отличается простотой, позволяет использовать готовые модули для решения типичных задач.

Запуск скриптов

Например, приведенный ниже код программы example01.py

#!/usr/bin/python
# coding: utf8

a = 15
print a
приведет к появлению на консоле числа "15". Для этого необходимо выполнить команду
python example01.py

Поскольку первая строка кода указывает полный путь к интерпретатору Python, то запускать скприпты можно также, как и bash-скрипты. Для этого только необходимо сделать файл скрипта исполняемым

chmod u+x example01.py
И затем, его статовиться возможным запустить командой
./example01.py

Вторая строка в скрипте дает возможность добавлять комментарии на русском языке в кодировке UTF-8. Эти первые две строки будут повторяться во всех Python-скриптах.

Математические расчеты

Для осуществления математических расчетов создан Python-модуль Numpy, который позволяет считывать данные из текстового файла, рассчитывать статистические характеристики и многое другое. Перед тем как использовать функции модуля, его необходимо подключить командой import. Ниже представлен пример использования этого модуля для расчета среднего и СКО по данным из текстового файла 26063.txt

1	-17.0
2	-8.1
3	-7.8
4	-4.4
5	-0.6
6	11.4
7	10.9
8	7.6
9	2.3
10	0.0
11	-9.8
12	-22.1
с помощью скрипта example02.py
#!/usr/bin/python
# coding: utf8

# Подключаем модуль математических расчетов
from numpy import *


# Считываем данные из текстового файла в двумернвый массив
data = loadtxt("26063.txt")

# Копируем все значения из второго столбца 2D массива в 1D массив
temp = data[:,1]

# Выводим на консоль среднее значение
print mean(temp)

# Выводим на консоль значение среднеквадратического отклонения
print std(temp)
В результате, на консоле появятся два числа - результат расчетов.

Построение графиков

Для создания графиков существует модуль matplotlib. Его необходимо подключить в начале скрипта example03.py.

#!/usr/bin/python
# coding: utf8

# Подключаем модуль математических расчетов
from numpy import *
# Подключаем модуль построения графиков
from matplotlib.pyplot import *


# Считываем данные из текстового файла в двумернвый массив
data = loadtxt("26063.txt")

# Копируем все значения из первого столбца 2D массива в 1D массив
time = data[:,0]

# Копируем все значения из второго столбца 2D массива в 1D массив
temp = data[:,1]

# Выводим на консоль среднее значение
print mean(temp)

# Выводим на консоль значение среднеквадратического отклонения
print std(temp)

# Строим временной ряд
plot(time, temp, color="red")

# Подписываем ось x
xlabel("Month", fontsize=14)

# Подписываем ось y
ylabel("Air Temperature (C)", fontsize=14)

# Рисуем сетку
grid()

# Записываем рисунок в файл с разрешением 150 dpi
savefig("figure.png", dpi=150)

# Отображаем рисунок на экране
show()
На консоле появятся теже два числа, а в новом графическом окне отобразиться график годовой ход температуры воздуха в Ленинграде в 1961 году.

Кроме того, в текущем каталоге появистя файл figure.png, содержащий изображение этого графика.

Чтение netCDF-файлов

Для чтения и записи netCDF-файлов предназначен модуль Scientific.IO.NetCDF. Его необходимо подключить в начале скрипта example04.py, который представлен ниже:

#!/usr/bin/python
# coding: utf8

# Подключаем модуль поддержки символов Unicode
from __future__ import unicode_literals
# Подключаем модуль математических расчетов
from numpy import *
# Подключаем все функции из модуля построения графиков
from matplotlib.pyplot import *
# Подключаем модуль для работы с netCDF-файлами
from Scientific.IO.NetCDF import NetCDFFile as Dataset


# Открываем netCDF-файл для чтения
cdf = Dataset("isccp_ts.nc", "r")
# Загружаем значения переменной "ts"
data = cdf.variables["ts"][:]
# Загружаем значения переменной "time"
time = cdf.variables["time"][:]
# Загружаем значения переменной "lat"
lat = cdf.variables["lat"][:]
# Загружаем значения переменной "lon"
lon = cdf.variables["lon"][:]
# Закрываем netCDF-файл
cdf.close()


# Задаем широту места (градусы)
latitude = 60.00
# Задаем долготу места (градусы)
longitude = 30.00
# Определяем номер ближайшего узла сетки по широте (номер строки)
y = (latitude-lat[0]) / (lat[len(lat)-1]-lat[0]) * len(lat)
# Определяем номер ближайшего узла сетки по долготе (номер столбца)
x = (longitude-lon[0]) / (lon[len(lon)-1]-lon[0]) * len(lon)
# Копируем в массив "param" из массива "data" данные только для узла (x,y)
param = data[:,y,x]


# Выводим на консоль статистические данные
print "Широта                            %.2f" % lat[y]
print "Долгота                           %.2f" % lon[x]
print "Минимальное значение              %.3f" % param.min()
print "Максимальное значение             %.3f" % param.max()
print "Среднее значение                  %.3f" % param.mean()
print "Медианное значение                %.3f" % median(param)
print "Среднее квадратическое отклонение %.3f" % param.std()


# Строим временную зависимость
plot(time, param, color="red")
# Подписываем ось x
xlabel("Время", fontsize=14)
# Подписываем ось y
ylabel("Температура поверхности (K)", fontsize=14)
# Рисуем сетку
grid()
# Записываем рисунок в файл "figure.png" с разрешением 150 dpi
savefig("figure.png", dpi=150)
# Отображаем рисунок на экране
show()
Рассмотрим структуру скрипта более подробно. Сначала подключаем Python-модуль Scientific.IO.NetCDF строкой
from Scientific.IO.NetCDF import NetCDFFile as Dataset
После этого становится доступным объект Dataset.

Затем открываем netCDF-файл командой

cdf = Dataset("isccp_ts.nc", "r")
Здесь мы указали имя файла isccp_ts.nc и режим доступа к файлу r только для чтения.

В файле isccp_ts.nc храняться значения четырех переменных: lat, lon, time, ts. Их значения мы загружаем в массивы соответственно командами:

data = cdf.variables["ts"][:]
time = cdf.variables["time"][:]
lat = cdf.variables["lat"][:]
lon = cdf.variables["lon"][:]

После того, как данные прочитаны из netCDF-файла его следует закрыть командой

cdf.close()
При этом освободятся ресурсы компьютера, используемые для доступа к файлу.

Создаем переменные для хранения значений географической широты и долготы некоего пункта

latitude = 60.00
longitude = 30.00

Определяем номер ближайшего узла сетки, то есть номер строки y и столбца x

y = (latitude-lat[0]) / (lat[len(lat)-1]-lat[0]) * len(lat)
x = (longitude-lon[0]) / (lon[len(lon)-1]-lon[0]) * len(lon)
Здесь используются значения массивов lat[] и lon[], содержащих значения всех широт и долгот узлов сетки.

Копируем в одномерный массив param данные из трехмерного массива data только для узла (x,y)

param = data[:,y,x]

Для расчета статистических характеристик данных используются функции модуля numpy. Так, минимальное, максимальное и среднее значения определяются с помощью функций

param.min()
param.max()
param.mean()

Затем, по данным из массива param создаем рисунок. Для этого строим ломанную линию красного цвета с помощью функции

plot(time, param, color="red")

Подписываем оси x и y шрифтом размером в 14 пунктов

xlabel("Время", fontsize=14)
ylabel("Температура поверхности (K)", fontsize=14)

Добавляем сетку на график, чтобы было легче воспринимать данные

grid()
Записываем рисунок в файл figure.png с разрешением 150 dpi, то есть 150 точек на дюйм (2.54 см)
savefig("figure.png", dpi=150)
И, наконец, отображаем этот же рисунок на экране
show()


Контрольные вопросы

  1. В каком каталоге расположен интерпретатор Python (ОС Ubuntu Linux)?
  2. Какой оператор служит для вывода данных на консоль?
  3. Возможно ли запускать Python-скрипты из командной строки также как и bash-скрипты?
  4. Какой Python-модуль содержит математические функции?
  5. Какой Python-модуль предназначен для создания графиков?
  6. Какой Python-модуль предназначен для работы с netCDF-файлами?
  7. Если в netCDF-файле данные расположены в узлах сетки 144x72 и покрывают весь земной шар, то с каким шагом по пространству эти данные?
  8. Укажите название функции, предназначенной для сохранения рисунка в графический файл

Полезная информация

Учебник по Python 2.6 (рус.)
Лекции по использованию Python в науке (англ.)
Лекция Alex Martelli, Python for Programmers (англ.)
Problem Solving with Algorithms and Data Structures (англ.)
Официальный сайт IPython (англ.)
Колдунов Н. Визуализация данных при помощи PyNGL (рус.)
Россум Г., Дрейк Ф.Л.Дж., Откидач Д.С. Язык программирования Python, 2001 (рус.)
D.J. Raymond, Python for Science
Matplotlib Screenshots