Главная страница

Питон для нормальных. Учебник Москва Базальт спо макс пресс 2018


Скачать 2.54 Mb.
НазваниеУчебник Москва Базальт спо макс пресс 2018
АнкорПитон для нормальных
Дата05.10.2022
Размер2.54 Mb.
Формат файлаpdf
Имя файлаsysoeva_sysoev_piton_dlya_normalnyh_ch1.pdf
ТипУчебник
#715174
страница10 из 14
1   ...   6   7   8   9   10   11   12   13   14
, которой каждый раз присваивалось одно и то же значение 1 (поскольку исходная переменная-счётчик была равна 0, а к ней прибавлялось 1), нужная же переменная komputilo_de_nombro_de_eventoj не изменялась. Эта ошибка была бы невозможна при использовании оператора
-=
:
>>> k o m p u t i l o _ d e _ n o m b r o _ d e _ e v e n t o j = 0
>>>
f o
r ela i
n x :
i f
ela > 0:
k o m p u t i l o _ d e _ n p m b r o j _ d e _ e v e n t o j += 1
T r a c e b a c k ( most recent call last ):
File " < pyshell #92 > " , line 3 ,
i n
< module >
k o m p u t i l o _ d e _ n p m b r o j _ d e _ e v e n t o j += 1
N a m e E r r o r : name ’ k o m p u t i l o _ d e _ n p m b r o j _ d e _ e v e n t o j ’
i s
n o
t defined
В результате мы получили сообщение об ошибке NameError, сразу локализовав возникшую проблему. Такие ошибки могут быть очень коварны в случае, если полученное на данном этапе значение используется в дальнейших вычислениях.
5.3
Двумерные массивы, форма массивов
Никакие сложные вычисления не могут обойтись без двумерных массивов,
часто называемых матрицами. Модуль numpy позволяет оперировать с массива- ми произвольной размерности: одномерными, двумерными, трёхмерными и т. д.
Чтобы работать с массивами произвольной размерности, удобно пользоваться

126
Глава 5. Массивы. Модуль numpy понятием формы (shape). Форма — совокупность длин массива по каждому из- мерению. Обычно форма задаётся в виде кортежа из нескольких чисел: двух для двумерного, трёх для трёхмерного и т. д. Форма — свойство массива и обозначает- ся shape. Форму массива можно задать при его создании. Если массив создаётся при помощи какой-нибудь встроенной функции numpy, его форма определяется этой функцией. Для одномерных массивов форма — это просто его длина.
f r
o m
numpy i
m p
o r
t
*
x = zeros ((2 , 3))
y = eye (3)
p r
i n
t
( x )
p r
i n
t
( y )
p r
i n
t
( x . shape )
p r
i n
t
(
l e
n
( x ))
p r
i n
t
( y . shape )
Вот вывод программы:
[[ 0.
0.
0.]
[ 0.
0.
0.]]
[[ 1.
0.
0.]
[ 0.
1.
0.]
[ 0.
0.
1.]]
(2, 3)
2
(3, 3)
В приведённом примере мы создали матрицу размера 2 × 3 из нулей с помощью функции zeros (в качестве аргумента передаём кортеж из двух числе (2, 3));
аналогично можно создать матрицу произвольного размера. Функция eye при- нимает единственный скалярный аргумент, поскольку она создаёт единичную квадратную матрицу заданного размера. Видно, что длина массива (len) — это его первая размерность (в ранних версиях numpy длина соответствовала общему числу элементов, т. е. произведению размерностей).
Также к двумерным массивам применимы операции sum, mean, max и т. д. По умолчанию, эти операции применяются к массиву, как если бы он был линейным списком всех чисел, независимо от его формы. Однако, указав параметр axis,
можно применить операцию для указанной оси массива:
f r
o m
numpy i
m p
o r
t
*
a = array ([[1 , 2 , 3] , [4 , 5 , 6]])
p r
i n
t
( a .
s u
m
())
p r
i n
t
( a .
s u
m
( axis =0))
p r
i n
t
( a .
s u
m
( axis =1))
p r
i n
t
( a .
m i
n
())
p r
i n
t
( a .
m i
n
( axis =0))
p r
i n
t
( a .
m i
n
( axis =1))

5.3. Двумерные массивы, форма массивов
127
Вывод программы:
21
[5 7 9]
[ 6 15]
1
[1 2 3]
[1 4]
Видно, что axis=0 работает с каждым столбцом отдельно, а axis=1 — с каждою строкою отдельно.
Итерирование многомерных массивов начинается с нулевой оси:
f r
o m
numpy i
m p
o r
t
*
a = array ([[1 , 2 , 3] , [4 , 5 , 6]])
f o
r element i
n a :
p r
i n
t
( element )
Вывод:
[1 2 3]
[4 5 6]
Однако если нужно перебрать поэлементно весь массив, как если бы он был одномерным, для этого можно использовать атрибут flat:
f o
r element i
n a . flat :
p r
i n
t
( element )
Вывод:
1 2
3 4
5 6
Несколько массивов могут быть объединены вместе вдоль разных осей с по- мощью функций hstack и vstack: hstack() объединяет массивы по начальному индексу, vstack() — по последнему:
f r
o m
numpy i
m p
o r
t
*
a = array ([[1 , 2 , 3] , [4 , 5 , 6]])
b = array ([[5 , 6 , 7] , [8 , 9 , 10]])
p r
i n
t
( vstack (( a , b )))
p r
i n
t
( hstack (( a , b )))
Вывод:

128
Глава 5. Массивы. Модуль numpy
A
a
1,0
a
1,1
a
0,0
a
0,1
a
3,0
a
3,1
a
2,0
a
2,1
b
1,1
b
1,2
b
0,1
b
0,2
b
1,0
b
0,0
B
c
0,0
c
1,1
c
0,1
c
2,1
c
3,1
c
1,2
c
3,0
c
3,2
c
1,0
c
2,0
c
0,2
c
2,2
C
Рис. 5.3. Схема матричного умножения: C = A × B.
[[ 1 2
3]
[ 4 5
6]
[ 5 6
7]
[ 8 9 10]]
[[ 1 2
3 5
6 7]
[ 4 5
6 8
9 10]]
Используя hsplit() вы можете разбить массив вдоль горизонтальной оси,
указав либо число возвращаемых массивов одинаковой формы, либо номера столбцов, после которых массив разрезается «ножницами». Но лучше для этого использовать срезы. Например, выведем первый столбец массива a:
p r
i n
t
( a [: , 1])
Вывод:
[2 5]
Модуль numpy предоставляет множество различных функций для работы с многомерными массивами, одна из самых популярных — функция dot. Для мат- риц и одномерных массивов-векторов эта функция соответствует функции мат- ричного умножения, см. рис. 5.3 (скалярное произведение для двух одномерных массивов):
f r
o m
numpy i
m p
o r
t
*
a = array ([[1 , 0] , [0 , 1]])
b = array ([[4 , 1] , [2 , 2]])
p r
i n
t
( dot (a , b ))
x = array ([ -4 , 1 , 3 , 2])
y = array ([ -1 , 8 , 1 , -2])

5.3. Двумерные массивы, форма массивов
129
p r
i n
t
( dot (x , y ))
z = array ([5 , -2])
p r
i n
t
( dot (z , b ))
p r
i n
t
( dot (b , z ))
Вывод программы показывает, что одномерный массив интерпретируется как вектор-столбец или вектор-строка в зависимости от контекста (об этом не нужно заботиться дополнительно):
[[4 1]
[2 2]]
11
[16 1]
[18 6]
В версиях Python, начиная с 3.5 и новее для обозначения матричного умножения вместо функции dot можно использовать символ @:
>>>
f r
o m
numpy i
m p
o r
t
*
>>> a = array ([[1 , 2 , 3] , [4 , 5 , 6] , [7 , 8 , 9]])
>>> a @ a array ([[ 30 ,
36 ,
42] ,
[ 66 ,
81 ,
96] ,
[102 , 126 , 150]])
Существуют две очень простые в использовании и чрезвычайно полезные функции в numpy, которые легко позволяют перейти от задач чисто учебных к задачам практически важным. Дело в том, что на практике все данные хра- нятся в файлах, чаще всего текстовых. Функция loadtxt позволяет загрузить данные из текстового файла в двумерный или одномерный, если в исходном файле данные представлены в 1 столбец или строку, массив. Функция savetxt в свою очередь позволяет записать массив в текстовый файл. Пример работы этих функций приведён ниже:
f r
o m
numpy i
m p
o r
t
*
a = eye (3)
b = arange (0 , 10 , 1)
savetxt ( ’ eye3 . txt ’ , a )
savetxt ( ’ Mas . txt ’ , b )
a2 = loadtxt ( ’ eye3 . txt ’)
p r
i n
t
( a2 )
b2 = loadtxt ( ’ Mas . txt ’)
p r
i n
t
( b2 )
По выводу программы видно, что чтение в переменную a2 произошло успеш- но:

130
Глава 5. Массивы. Модуль numpy
[[ 1.
0.
0.]
[ 0.
1.
0.]
[ 0.
0.
1.]]
[ 0.
1.
2.
3.
4.
5.
6.
7.
8.
9.]
Наличие файлов
’eye3.txt’
и
’Mas.txt’
на диске и его содержимое вы можете проверить с помощью вашего файлового менеджера.
5.4
Примеры решения задач
Пример задачи 14 Создайте и выведите на экран квадратную матрицу размера n × n, где на главной диагонали стоят нули, элементы выше неё — единицы, ниже — минус единицы. Затем сохраните получившийся массив в текстовый файл.
Решение задачи 14
f r
o m
numpy i
m p
o r
t
*
n =
i n
t
(
i n
p u
t
( ’Размер матрицы: ’ ))
x = zeros (( n , n ))
f o
r i
i n
r a
n g
e
( n ):
x [i , : i ] = -1
x [i , i +1:] = 1
p r
i n
t
( x )
savetxt ( ’ Mas . txt ’ , x )
Вывод программы:
Размер матрицы: 3
[[ 0.
1.
1.]
[-1.
0.
1.]
[-1. -1.
0.]]
Заметим, что здесь мы воспользовались срезами, попутно сократив 1 цикл и убрав условный оператор.
Пример задачи 15 С помощью функции loadtxt загрузите из файла, со- зданного в предыдущем задании, данные в массив y. Убедитесь, что но- вый массив получился двумерным. Создайте одномерный массив-диапазон и прибавьте его к вашей матрице. Посмотрите, что получилось. Опре- делите максимальный и минимальный элементы массива. Посчитайте сумму элементов по каждой строке массива. Запишите в два отдельных текстовых файла ваш массив-матрицу и массив-вектор.
Решение задачи 15

5.4. Примеры решения задач
131
f r
o m
numpy i
m p
o r
t
*
y = loadtxt ( ’ Mas . txt ’)
p r
i n
t
( y . shape )
a = arange (0 , n , 1)
y = y + a p
r i
n t
( y )
p r
i n
t
( y .
m i
n
())
p r
i n
t
( y .
m a
x
())
p r
i n
t
( y .
s u
m
( axis =1))
savetxt ( ’ Matrix . txt ’ , y )
savetxt ( ’ Vector . txt ’ , a )
Вывод программы:
(3, 3)
[[ 0.
2.
3.]
[-1.
1.
3.]
[-1.
0.
2.]]
-1.0 3.0
[ 5.
3.
1.]
Пример задачи 16 Протабулируйте (вычислите значения функций при изменении аргумента в некоторых пределах с заданным шагом) функцию на отрезке [−π; π].
Решение задачи 16
f r
o m
numpy i
m p
o r
t
*
t = arange ( - pi , pi , pi /6)
x = sin ( t )
f o
r i
i n
r a
n g
e
(
l e
n
( t )):
p r
i n
t
( " {:12.8 f }\ t {:12.8 f } " .
f o
r m
a t
( t [ i ] , x [ i ]))
Вывод программы:
-3.14159265
-0.00000000
-2.61799388
-0.50000000
-2.09439510
-0.86602540
-1.57079633
-1.00000000
-1.04719755
-0.86602540
-0.52359878
-0.50000000
-0.00000000
-0.00000000 0.52359878 0.50000000 1.04719755 0.86602540

132
Глава 5. Массивы. Модуль numpy
1.57079633 1.00000000 2.09439510 0.86602540 2.61799388 0.50000000 5.5
Задания на массивы, модуль numpy
В заданиях 15 и 17 следует выполнить три пункта в зависимости от номера в списке группы в алфавитном порядке. Необходимо сделать задания №m, №m+5,
№m + 10, m = (n − 1)%5 + 1, где n — номер в списке группы.
Задание 15 Создайте и выведите на экран массивы. Получившиеся мат- рицы сохраните в текстовые файлы.
1. из нулей одномерные длины 10 и 55, матрицу размерами 3 × 4, трёхмерный массив формы 2 × 4 × 5;
2. из единиц одномерные длины 10 и 55, матрицу размерами 3×4, трёхмерный массив формы 2 × 4 × 5;
3. из девяток одномерные длины 10 и 55, матрицу размерами 3×4, трёхмерный массив формы 2 × 4 × 5;
4. одномерные длины 10 и 55, матрицу размерами 3 × 4, трёхмерный массив формы 2 × 4 × 5, все состоящие целиком из значений 0.25;
5. массив-диапазон от −10 до 10 с шагом 0.1;
6. массив-диапазон от −e до e с шагом e/50;
7. массив-диапазон от −15π до 15π с шагом pi/12;
8. единичную матрицу размера 5 × 5;
9. диагональную матрицу размера 5 × 5, все значения на главной диагонали которой равны 0.5;
10. матрицу размера 5 × 5, где на главной диагонали стоят единицы, а прочие элементы равны 2;
11. матрицу размера 5 × 5, где в первом столбце стоят единицы, во втором —
двойки, в третьем — тройки и т. д.
12. матрицу размера 5 × 5, где в первой строке стоят единицы, во втором —
двойки, в третьем — тройки и т. д.
13. матрицу размера 5 × 5, где на главной диагонали стоят нули, элементы выше неё — единицы, ниже — минус единицы;

5.5. Задания на массивы, модуль numpy
133 14. верхнюю треугольную матрицу 5 × 5, где все элементы выше главной диа- гонали равны −2, а на ней — единицы;
15. нижнюю треугольную матрицу 5 × 5, где все элементы ниже главной диа- гонали равны 2, а на ней — единицы.
Внимание: задания 10–15 требуют умения манипулировать с отдельными столбцами или строками двумерного массива!
Задание 16 Загрузите из файла, созданного в предыдущем задании, дан- ные в массив. Убедитесь, что новый массив получился двумерный. Со- здайте одномерный массив-диапазон и прибавьте его к вашей матрице.
Посмотрите, что получилось. Определите максимальный и минималь- ный элементы массива. Посчитайте сумму элементов по каждой стро- ке массива. Запишите в два отдельных текстовых файла ваши массив- матрицу и массив-вектор.
Задание 17 Протабулируйте (вычислите значения функций при измене- нии аргумента в некоторых пределах с заданным шагом) функции:
1. x
2
на отрезке x ∈ [−2; 2] с шагом 0.01, с шагом 0.1, с шагом 0.25;
2. x
3
на отрезке x ∈ [−2; 2] с шагом 0.01, с шагом 0.1, с шагом 0.25;
3. x
4
на отрезке x ∈ [−2; 2] с шагом 0.01, с шагом 0.1, с шагом 0.25;
4. cos(2πt) на отрезке t ∈ [−10; 10] с шагом 1 и с шагом 0.25;
5.
1
t cos(2πt) на отрезке t ∈ [1; 10] с шагом 1 и с шагом 0.25;
6. e

t cos(2πt) на отрезке t ∈ [−10; 10] с шагом 1 и с шагом 0.25;
7. 4 sin(πt + π/8) − 1 на отрезке t ∈ [−10; 10] с шагом 1 и с шагом 0.25;
8. 2 cos(t − 2) + sin(2 ∗ t − 4) на отрезке t ∈ [−20π; 10π] с шагом π и с шагом
π/12;
9. ln(x + 1) на отрезке x ∈ [0; e − 1] с шагом 0.01 и с шагом 0.001;
10. log
2
(|x|) на отрезке x ∈ [−4; 4] за исключением точки x = 0 с шагом 0.1 и с шагом 0.25;
11. 2
x на отрезке x ∈ [−2; 2] с шагом 0.01, с шагом 0.1, с шагом 0.25;
12. e x
на отрезке x ∈ [−2; 2] с шагом 0.01, с шагом 0.1, с шагом 0.25;
13. 2

x на отрезке x ∈ [−2; 2] с шагом 0.01, с шагом 0.1, с шагом 0.25;
14.
3

x на отрезке x ∈ [1; 125] с шагом 1 и с шагом 5, но так, чтобы значения 1
и 5 присутствовали среди аргументов;
15.
5

x на отрезке x ∈ [1; 32] с шагом 1 и с шагом 0.25.

Глава 6
Графики. Модуль matplotlib
Построение графиков — один из главных этапов обработки данных. Все со- временные компьютерные программы, предоставляющие функцию построения графиков, условно можно разделить на две категории: программы с визуаль- ным интерфейсом, где построение и редактирование графика осуществляется средствами разного рода меню, полей ввода, лист-боксов, чек-боксов и других виджетов, и программы, где для построения графика необходимо писать коман- ды, объединяемые в так называемы скрипты. К первой категории относятся,
например, Origin, MS Excel, OpenOffice/LibreOffice Calc, Statistica, Grapher, ко второй — gnuplot, многие математические пакеты, например, MATLAB и SciLab и различные библиотеки вроде PGPlot и PLPlot, имеющие поддержку во многих языках программирования.
Основное преимущество скриптового способа построения графика в том, что вы можете встроить его без проблем в вашу программу, производящую вычис- ления. Кроме того, скрипты позволяют легко перестраивать графики с новыми данными, автоматизировать построение графиков, дают почти неограниченный контроль над точностью позиционирования и размером деталей.
Модуль matplotlib — специализированная библиотека для языка Python. Хо- тя основное её преимущество в простоте и быстроте использования, она позволя- ет делать графики очень высокого типографского качества. Модуль matplotlib базируется на возможностях numpy, установка которого обязательна для функ- ционирования matplotlib.
6.1
Простые графики
Непосредственно за построение графиков отвечает библиотека pyplot модуля matplotlib
. Основная команда для построения графиков — команда plot. У
команды plot существует множество вариантов синтаксиса, в простейшем случае она требует единственный аргумент — массив, но подойдёт и список, кортеж или даже диапазон. Вот пример построения простейшего графика (см. рис. 6.1(a)):

6.1. Простые графики
135
f r
o m
m a t p l o t l i b . pyplot i
m p
o r
t
*
x = [3 , 4 , 6 , 12.5 , 13.4 , 8.9 , 7.1]
plot ( x )
show ()
Команда show() даётся без аргументов и нужна для того, чтобы вывести на экран содержимое графического буфера, куда заносятся результаты ваших дей- ствий. В приведённом примере получился график в виде ломаной, где по оси абсцисс отложены номера элементов списка x, а по оси ординат — сами эти эле- менты. Чтобы изменить тип линии или заменить её на маркеры, можно указать дополнительный аргумент в команде plot — строку форматирования. Например,
строка из одного символа дефиса ’-’ соответствует поведению по умолчанию —
сплошной линии, ’–’ — прерывистой линии, ’:’ — пунктиру. При этом маркеры:
кружочки, квадраты, ромбы будут располагаться только в тех местах, где есть данные.
0 1
2 3
4 5
6 2
4 6
8 10 12 14 0
1 2
3 4
5 6
2 4
6 8
10 12 14
(a)
(b)
Рис. 6.1. Простейший график сплошными линиями — (a) и пунктиром и круж- ками одновременно — (b).
Маркеры и линии можно комбинировать. Изменим предпоследнюю строчку предыдущей программы следующим образом (результат на рис. 6.1(b)):
plot (x , ’: o ’)
show ()
В результате, тот же график будет выглядеть немного иначе: на месте распо- ложения данных появятся жирные синие кружки, соединённые тонкою пунктир- ною линией. Чтобы изменить цвет графика, достаточно указать дополнительный именованный параметр color:
plot (x , ’: o ’ , color = ’ grey ’)
show ()

136
Глава 6. Графики. Модуль matplotlib
Таблица 6.1. Встроенные типы линий (linestyle) и маркеров
(markers).
Строка форматирования
Описание
’-’
сплошная линия
’–’
прерывистая линия
’-.’
штрих-пунктир
’:’
пунктирная линия
’.’
маркер точка
’,’
маркер пиксель
’o’
маркер кружочек
’v’
маркер треугольник углом вниз

ˆ’
маркер треугольник углом вверх
’<’
маркер треугольник углом влево
’>’
маркер треугольник углом вправо
’s’
маркер квадрат
’d’
1   ...   6   7   8   9   10   11   12   13   14


написать администратору сайта