

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
In [104]:
y
Out[104]:
array([ 1.1, 3.3, 4.4, 5.5])
Как он работает? Очень просто. (Ну ок, не очень.) Для начала, что такое x < 50 ? Это результат применения операции «сравнение с 50» к каждому элементу массива. То есть это новый массив.
In [105]:
x < 50
Out[105]:
array([ True, False, True, True, True], dtype=bool)
Если в каком-то месте стоит True , то это означает, что на соответствующем месте в x стоит элемент, который удовлетворяет условию, а если False , то не удовлетворяет.
Теперь можно попробовать подставить массив из True и False в качестве индекса в x .
In [106]:
x[ array([True, True, False, False, True]) ]
Out[106]:
array([ 1.1, 100. , |
5.5]) |
Эта штука выбирает ровно те элементы, на чьих местах стоит True — то есть ровно те, для которых выполнялось условие. То, что нам нужно!
А вот так можно проверить несколько условий одновременно:
In [115]:
x[ (x < 50) & (x > 2) ]
Out[115]:
array([ 3.3, 4.4, 5.5])
Скобочки очень важны, иначе ничего не заработает. Операция & соответствует логическому И и опять же выполняется поэлементно.
In [76]:
(x < 50) & (x > 2)
Out[76]:
array([False, False, True, True, True], dtype=bool)
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
11/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
Для логического ИЛИ мы бы исползовали | , а для отрицания ~ .
In [116]:
(x < 50) | (x > 2)
Out[116]:
array([ True, True, True, True, True], dtype=bool)
In [117]:
~ (x < 50)
Out[117]:
array([False, True, False, False, False], dtype=bool)
Результатом такого выбора снова является вид, и это очень удобно, потому что позволяет заменять одни элементы на другие в зависимости от условий и таким образом избавляться от операторов if .
In [118]: |
|
|
|
x |
|
|
|
Out[118]: |
|
|
|
array([ 1.1, 100. , |
3.3, |
4.4, |
5.5]) |
In [121]: |
|
|
|
x[ x>50 ] = 0 |
|
|
|
# заменить все элементы, большие 50, на 0
In [122]:
x
Out[122]:
array([ 1.1, 0. , 3.3, 4.4, 5.5])
Кстати, чтобы узнать, правда ли, что два массива равны (в том числе, что состоят из одних и тех же элементов, находящихся в одном и том же порядке), теперь нельзя использовать == — ведь это тоже поэлементная операция!
In [142]:
np.array([1, 2, 3]) == np.array([1, 2, 3])
Out[142]:
array([ True, True, True], dtype=bool)
Чтобы понять, правда ли, что массивы равны, можно использовать такой синтаксис:
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
12/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
In [144]:
(np.array([1, 2, 3]) == np.array([1,2,3])).all()
Out[144]:
True
Здесь мы сначала сравниваем массивы поэлементно, а потом применяем к результату метод all() , возвращающий истину только если все элементы являются истиными. Этот подход часто используется, хотя имеет свои подводные камни (см. на stackoverflow (http://stackoverflow.com/questions/10580676/comparing-two-numpy-arrays-for-equality-element-wise)). Есть и специализированная функция для проверки на равенство:
In [151]:
np.array_equal(np.array([1, 2, 3]), np.array([1, 2, 3]))
Out[151]:
True
Построение графиков в matplotlib
В Python существует много способов строить графики. Мы сейчас рассмотрим самый простой из них, а позже поговорим про более сложные. Для этого нам потребуется библиотека matplotlib , а точнее её часть под названием pyplot . Стандартный способ её импорта выглядит вот так:
In [123]:
import matplotlib.pyplot as plt
Чтобы графики рисовались прямо в ноутбуке, нужно дать вот такую магическую команду:
In [124]:
%matplotlib inline
Простейшее рисование — это функция plot , она принимает на вход список -координат, список -координат и рисует соответствующую картинку либо в виде ломаной:
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
13/22 |

28.11.2022, 02:19 12 Библиотеки numpy и matplotlib - Jupyter Notebook
In [84]:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
Out[84]:
[<matplotlib.lines.Line2D at 0x10ff2ef60>]
либо в виде отдельный точек:
In [126]:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'o')
Out[126]:
[<matplotlib.lines.Line2D at 0x1112d2550>]
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
14/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
Либо ещё кучей способов.
In [127]:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], '-o')
Out[127]:
[<matplotlib.lines.Line2D at 0x111394470>]
Посмотрим, как numpy работает в связке с matplotlib.pyplot . Вообще это всё очень похое на MATLAB, и если вы знаете MATLAB, то для вас многое здесь будет знакомо — и наоборот, после numpy и matplotlib.pyplot будете чувствовать себя как дома в MATLAB.
Chewie, we're home. [Здесь должна была быть картинка из «Звёздных войн», но я не могу её включить по соображениям авторских прав.]
In [128]:
x = np.linspace(-5, 5, 200)
# это массив из 200 элементов, состоящий из равномерно разбросанных чисел от -5 до 5
In [129]:
len(x)
Out[129]:
200
In [132]:
x[:10]
Out[132]:
array([-5. , -4.94974874, -4.89949749, -4.84924623, -4.79899497, -4.74874372, -4.69849246, -4.64824121, -4.59798995, -4.54773869])
Вот так можно нарисовать параболу:
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
15/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
In [136]:
plt.plot(x, x**2)
Out[136]:
[<matplotlib.lines.Line2D at 0x1115d62b0>]
Действительно, x**2 — это массив, элементами которого являются квадраты чисел, лежащих в x . Значит, построив график, состоящий из точек, -координаты которых записаны в x , а -координаты с x**2 , мы построим график функции .
А вот, например, синусоида:
In [139]:
plt.plot(x, np.sin(x))
Out[139]:
[<matplotlib.lines.Line2D at 0x111758710>]
А вот что-то посложнее:
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
16/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
In [140]:
plt.plot(x, np.sin(x**2))
Out[140]:
[<matplotlib.lines.Line2D at 0x11180f7b8>]
Вот так можно построить несколько графиков и сделать подписи.
In [157]:
x = np.linspace(-1,1,201) plt.plot(x,x**2, label = '$y = x^2$') plt.plot(x,x**3, label = '$y = x^3$') plt.legend(loc='best')
Out[157]:
<matplotlib.legend.Legend at 0x111b369b0>
Знак $ в label используется для того, чтобы записывать формулы — это делается в LaTeX (https://en.wikibooks.org/wiki/LaTeX/Mathematics)-нотации и долларами там обозначается начало и конец формулы. (Кстати, в IPython Notebook в ячейках типа Markdown тоже можно записывать формулы в
LaTeX-нотации.)
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
17/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
Конечно, мы могли бы получить x и y не в результате вычисления значений какой-то функции, а откуда-то извне. Возьмём для примера случайные числа.
In [152]:
x = np.random.random(100)
In [153]:
y = np.random.random(100) plt.plot(x,y, 'o')
Out[153]:
[<matplotlib.lines.Line2D at 0x1118ee668>]
Есть и специализированная функция для создания scatter plot.
In [154]:
plt.scatter(x,y)
Out[154]:
<matplotlib.collections.PathCollection at 0x1119a8048>
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
18/22 |

28.11.2022, 02:19 |
12 Библиотеки numpy и matplotlib - Jupyter Notebook |
Ещё можно построить гистограмму
(https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D1%81%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D0%B
|
|
|
|
|
|
|
|
|
|
|
|
In [155]: |
|
|
|
|
|
|
|
|
|
|
|
plt.hist(x) |
|
|
|
|
|
|
|
|
|
|
|
Out[155]: |
|
|
|
|
|
|
|
|
|
|
|
(array([ 10., |
9., |
8., |
8., |
7., |
11., |
9., |
12., |
12., |
14.]), |
||
array([ 0.00350726, |
0.10110942, |
0.19871157, |
0.29631372, |
0.39391588, |
|||||||
0.49151803, |
0.58912018, |
0.68672234, |
0.78432449, |
0.88192664, |
|||||||
0.9795288 ]), |
|
|
|
|
|
|
|
|
|
<a list of 10 Patch objects>)
Можно строить трёхмерные картинки, но тут уже нужна магия и я не буду вдаваться в детали.
In [175]:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D fig = plt.figure()
<matplotlib.figure.Figure at 0x111b6d668>
In [176]:
%matplotlib inline
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
19/22 |

28.11.2022, 02:19 12 Библиотеки numpy и matplotlib - Jupyter Notebook
In [178]:
x,y = np.mgrid[-1:1:0.01, -1:1:0.01]
ax = fig.add_subplot(111, projection='3d') ax.plot_surface(x,y,x**2+y**2)
fig Out[178]:
Наконец, можно строить интерактивные картинки!
In [180]:
from ipywidgets import interact, interactive, fixed import ipywidgets as widgets
import numpy as np
import matplotlib.pyplot as plt
In [181]:
%matplotlib inline
In [182]:
def plot_pic(a, b):
x = np.linspace(-3,3,200) plt.plot(x, np.sin(x*a+b))
127.0.0.1:8888/notebooks/EXONTOOLS/2/Доп. занятия/12 Библиотеки numpy и matplotlib.ipynb |
20/22 |