<jupyter_start><jupyter_text>Открытый курс по машинному обучениюАвторы материала: программист-исследователь Mail.ru Group, старший преподаватель Факультета Компьютерных Наук ВШЭ Юрий Кашницкий и Data Scientist в Segmento Екатерина Демидова. Материал распространяется на условиях лицензии [Creative Commons CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала.  Тема 1. Первичный анализ данных с Pandas Часть 0. Работа с векторами в библиотеке NumPy **Numpy** - это библиотека Python для вычислительно эффективных операций с многомерными массивами, предназначенная в основном для научных вычислений.<jupyter_code># Python 2 and 3 compatibility
from __future__ import absolute_import, division, print_function, unicode_literals

# отключим предупреждения Anaconda
import warnings

warnings.simplefilter("ignore")
import numpy as np
a = np.array([0, 1, 2, 3])
a<jupyter_output><empty_output><jupyter_text>Такой массив может содержать:- значения физических величин в разые моменты времени при моделировании- значения сигнала, измеренного прибором- интенсивности пикселов - 3D координаты объектов, полученных, например, при МРТ- ... **Зачем NumPy:** Эффективность базовых операций<jupyter_code>L = range(1000)
%timeit [i**2 for i in L]
a = np.arange(1000)
%timeit a**2<jupyter_output><empty_output><jupyter_text>Интерактивная справка<jupyter_code>?np.array<jupyter_output><empty_output><jupyter_text>поиск в документации<jupyter_code>np.lookfor("create array")
np.con*?<jupyter_output><empty_output><jupyter_text>Библиотеку принято импортировать так<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>Создание массивов * **1-D**:<jupyter_code>a = np.array([0, 1, 2, 3])
a
a.ndim
a.shape
len(a)<jupyter_output><empty_output><jupyter_text>* **2-D, 3-D, ...**:<jupyter_code>b = np.array([[0, 1, 2], [3, 4, 5]])  # 2 x 3 array
b
b.ndim
b.shape
len(b)  # returns the size of the first dimension
c = np.array([[[1], [2]], [[3], [4]]])
c
c.shape<jupyter_output><empty_output><jupyter_text>Методы для создания массивов На практике мы редко добавляем элементы по одному - Равномерно распределенные элементы:<jupyter_code>a = np.arange(10)  # 0 .. n-1  (!)
a
b = np.arange(1, 9, 2)  # start, end (exclusive), step
b<jupyter_output><empty_output><jupyter_text>- по числу элементов:<jupyter_code>c = np.linspace(0, 1, 6)  # start, end, num-points
c
d = np.linspace(0, 1, 5, endpoint=False)
d<jupyter_output><empty_output><jupyter_text>- Часто встречающиеся массивы:<jupyter_code>a = np.ones((3, 3))  # reminder: (3, 3) is a tuple
a
b = np.zeros((2, 2))
b
c = np.eye(3)
c
d = np.diag(np.array([1, 2, 3, 4]))
d<jupyter_output><empty_output><jupyter_text>* `np.random` генерация случайных чисел (Mersenne Twister PRNG):<jupyter_code>a = np.random.rand(4)  # uniform in [0, 1]
a
b = np.random.randn(4)  # Gaussian
b
np.random.seed(1234)  # Setting the random seed<jupyter_output><empty_output><jupyter_text>Основные типы данных NumPy Точка после числа означает, что это тип данных `float64`<jupyter_code>a = np.array([1, 2, 3])
a.dtype
b = np.array([1.0, 2.0, 3.0])
b.dtype<jupyter_output><empty_output><jupyter_text>Можно задать тип данных явно. По умолчанию - `float64`<jupyter_code>c = np.array([1, 2, 3], dtype=float)
c.dtype
a = np.ones((3, 3))
a.dtype<jupyter_output><empty_output><jupyter_text>Прочие типы данных: - Комплексные числа<jupyter_code>d = np.array([1 + 2j, 3 + 4j, 5 + 6 * 1j])
d.dtype<jupyter_output><empty_output><jupyter_text>- Bool<jupyter_code>e = np.array([True, False, False, True])
e.dtype<jupyter_output><empty_output><jupyter_text>- СтрокиНа строки память выделяется "жадно" - по максимальному числу литер в строке. В этом примере на каждую строку выделяется по 7 литер, и тип данных - 'S7'<jupyter_code>f = np.array(["Bonjour", "Hello", "Hallo",])
f.dtype  # <--- strings containing max. 7 letters<jupyter_output><empty_output><jupyter_text>Основы визуализации $ ipython notebook --pylab=inline Или из тетрадки:<jupyter_code>%pylab inline<jupyter_output><empty_output><jupyter_text>Параметр `inline` говорит серверу IPython о том, что результаты будут отображаться в самой тетрадке, а не в новом окне.  Импортируем *Matplotlib*<jupyter_code>import matplotlib.pyplot as plt  # the tidy way
x = np.linspace(0, 3, 20)
y = np.linspace(0, 9, 20)
plt.plot(x, y)  # line plot
plt.show()  # <-- shows the plot (not needed with pylab)<jupyter_output><empty_output><jupyter_text>Или с использованием *pylab*:<jupyter_code>plot(x, y)  # line plot<jupyter_output><empty_output><jupyter_text>Использование `import matplotlib.pyplot as plt` рекомендуется для скриптов, а `pylab` - в тетрадках IPython.  - Отображение одномерных массивов:<jupyter_code>x = np.linspace(0, 3, 20)
y = np.linspace(0, 9, 20)
plt.plot(x, y)  # line plot
plt.plot(x, y, "o")  # dot plot<jupyter_output><empty_output><jupyter_text>- Отображение двухмерных массивов (например, изображений):<jupyter_code>image = np.random.rand(30, 30)
plt.imshow(image, cmap=plt.cm.hot)
plt.colorbar()<jupyter_output><empty_output><jupyter_text>Индексирование массивов и срезы В целом так же, как со встроенными последовательностями Python (например, как со списками).<jupyter_code>a = np.arange(10)
a
a[0], a[2], a[-1]<jupyter_output><empty_output><jupyter_text>Работает и популярный в Python способ отражения массива:<jupyter_code>a[::-1]<jupyter_output><empty_output><jupyter_text>Для многомерных массивов индексы - это кортежи целых чисел<jupyter_code>a = np.diag(np.arange(3))
a
a[1, 1]
a[2, 1] = 10  # third line, second column
a
a[1]<jupyter_output><empty_output><jupyter_text>**Срезы**<jupyter_code>a = np.arange(10)
a
a[2:9:3]  # [start:end:step]<jupyter_output><empty_output><jupyter_text>Последний индекс не включается<jupyter_code>a[:4]<jupyter_output><empty_output><jupyter_text>По умолчанию \`start\` -  0,\`end\` - индекс последнего элемента, \`step\` - 1:<jupyter_code>a[1:3]
a[::2]
a[3:]<jupyter_output><empty_output><jupyter_text>Можно совмещать присваивание и срез:<jupyter_code>a = np.arange(10)
a[5:] = 10
a
b = np.arange(5)
a[5:] = b[::-1]
a<jupyter_output><empty_output><jupyter_text>Пример. Матрица делителей Отобразить матрицу, в которой вычеркивается **(x, y)**, если **y** делится на **x**.<jupyter_code>from IPython.display import Image

Image(filename="../../img/prime-sieve.png")<jupyter_output><empty_output><jupyter_text>* Создадим массив `is_prime`, заполненний значениями True<jupyter_code>is_prime = np.ones((100,), dtype=bool)<jupyter_output><empty_output><jupyter_text>* Вычеркнем 0 и 1 как не являющиеся простыми:<jupyter_code>is_prime[:2] = 0<jupyter_output><empty_output><jupyter_text>* Для каждого натурального `j` начиная с  2, "вычеркнем" числа, ему кратные:<jupyter_code>N_max = int(np.sqrt(len(is_prime)))
for j in range(2, N_max):
    is_prime[2 * j :: j] = False

is_prime<jupyter_output><empty_output><jupyter_text>Индексирование масками<jupyter_code>np.random.seed(3)
a = np.random.random_integers(0, 20, 15)
a
(a % 3 == 0)
mask = a % 3 == 0
extract_from_a = a[mask]  # or,  a[a%3==0]
extract_from_a  # extract a sub-array with the mask<jupyter_output><empty_output><jupyter_text>Индексирование маской может быть очень полезным для присваивания значений части элементов массива:<jupyter_code>a[a % 3 == 0] = -1
a<jupyter_output><empty_output><jupyter_text>Индексирование массивом целых чисел<jupyter_code>a = np.arange(0, 100, 10)
a
a[[2, 3, 2, 4, 2]]  # note: [2, 3, 2, 4, 2] is a Python list
a[[9, 7]] = -100
a
a = np.arange(10)
idx = np.array([[3, 4], [9, 7]])
idx.shape
a[idx]<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13716067021691128, 'fraction_numerical': 0.027016495648785558, 'mean_word_length': 6.661691542288557, 'pattern_counts': {'":': 0, '<': 143, '<?xml version=': 0, '>': 141, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '35', 'dir': 'jupyter-structured-clean-dedup', 'id': '284897', 'license': 'Unlicense', 'n_tokens_mistral': 3496, 'n_tokens_neox': 3658, 'n_words': 695, 'path': 'jupyter_russian/topic01_pandas_data_analysis/lesson1_part0_numpy.ipynb', 'repo_name': 'salman394/AI-ml--course', 'size': '7699'}