<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <center>
<img src="../img/ods_stickers.jpg">
Открытый курс по машинному обучению
Авторы материала
Step1:  Такой массив может содержать
Step2:  Интерактивная справка
Step3:  поиск в документации
Step4:  Библиотеку принято импортировать так
Step5:  Создание массивов
1-D
Step6:  2-D, 3-D, ...
Step7:  Методы для создания массивов
На практике мы редко добавляем элементы по одному
Равномерно распределенные элементы
Step8:  по числу элементов
Step9:  Часто встречающиеся массивы
Step10:  np.random генерация случайных чисел (Mersenne Twister PRNG)
Step11:  Основные типы данных NumPy
Точка после числа означает, что это тип данных float64
Step12:  Можно задать тип данных явно. По умолчанию - float64
Step13:  Прочие типы данных
Step14:  Bool
Step15:  Строки
На строки память выделяется "жадно" - по максимальному числу литер в строке. 
В этом примере на каждую строку выделяется по 7 литер, и тип данных - 'S7'
Step16:  Основы визуализации
$ ipython notebook --pylab=inline
Или из тетрадки
Step17:  Параметр inline говорит серверу IPython о том, что результаты будут отображаться в самой тетрадке, а не в новом окне. 
Импортируем Matplotlib
Step18:  Или с использованием pylab
Step19:  Использование import matplotlib.pyplot as plt рекомендуется для скриптов, а pylab - в тетрадках IPython.
Отображение одномерных массивов
Step20:  Отображение двухмерных массивов (например, изображений)
Step21:  Индексирование массивов и срезы
В целом так же, как со встроенными последовательностями Python (например, как со списками).
Step22:  Работает и популярный в Python способ отражения массива
Step23:  Для многомерных массивов индексы - это кортежи целых чисел
Step24:  Срезы
Step25:  Последний индекс не включается
Step26:  По умолчанию `start` -  0,
`end` - индекс последнего элемента, `step` - 1
Step27:  Можно совмещать присваивание и срез
Step28:  Пример. Матрица делителей
Отобразить матрицу, в которой вычеркивается (x, y), если y делится на x.
Step29:  Создадим массив is_prime, заполненний значениями True
Step30:  Вычеркнем 0 и 1 как не являющиеся простыми
Step31:  Для каждого натурального j начиная с  2, "вычеркнем" числа, ему кратные
Step32:  Индексирование масками
Step33:  Индексирование маской может быть очень полезным для присваивания значений части элементов массива
Step34:  Индексирование массивом целых чисел
<ASSISTANT_TASK:>
Python 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
Explanation: <center>
<img src="../img/ods_stickers.jpg">
Открытый курс по машинному обучению
Авторы материала: программист-исследователь Mail.ru Group, старший преподаватель Факультета Компьютерных Наук ВШЭ Юрий Кашницкий и Data Scientist в Segmento Екатерина Демидова. Материал распространяется на условиях лицензии Creative Commons CC BY-NC-SA 4.0. Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала.
<center>Тема 1. Первичный анализ данных с Pandas</center>
<center>Часть 0. Работа с векторами в библиотеке NumPy
Numpy - это библиотека Python для вычислительно эффективных операций с многомерными массивами, предназначенная в основном для научных вычислений.
End of explanation
L = range(1000)
%timeit [i**2 for i in L]
a = np.arange(1000)
%timeit a**2
Explanation: Такой массив может содержать:
- значения физических величин в разые моменты времени при моделировании
- значения сигнала, измеренного прибором
- интенсивности пикселов 
- 3D координаты объектов, полученных, например, при МРТ
- ...
Зачем NumPy: Эффективность базовых операций
End of explanation
?np.array
Explanation: Интерактивная справка
End of explanation
np.lookfor('create array') 
np.con*?
Explanation: поиск в документации
End of explanation
import numpy as np
Explanation: Библиотеку принято импортировать так
End of explanation
a = np.array([0, 1, 2, 3])
a
a.ndim
a.shape
len(a)
Explanation: Создание массивов
1-D:
End of explanation
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
Explanation: 2-D, 3-D, ...:
End of explanation
a = np.arange(10) # 0 .. n-1  (!)
a
b = np.arange(1, 9, 2) # start, end (exclusive), step
b
Explanation: Методы для создания массивов
На практике мы редко добавляем элементы по одному
Равномерно распределенные элементы:
End of explanation
c = np.linspace(0, 1, 6)   # start, end, num-points
c
d = np.linspace(0, 1, 5, endpoint=False)
d
Explanation: по числу элементов:
End of explanation
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
Explanation: Часто встречающиеся массивы:
End of explanation
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
Explanation: np.random генерация случайных чисел (Mersenne Twister PRNG):
End of explanation
a = np.array([1, 2, 3])
a.dtype
b = np.array([1., 2., 3.])
b.dtype
Explanation: Основные типы данных NumPy
Точка после числа означает, что это тип данных float64
End of explanation
c = np.array([1, 2, 3], dtype=float)
c.dtype
a = np.ones((3, 3))
a.dtype
Explanation: Можно задать тип данных явно. По умолчанию - float64
End of explanation
d = np.array([1+2j, 3+4j, 5+6*1j])
d.dtype
Explanation: Прочие типы данных:
Комплексные числа
End of explanation
e = np.array([True, False, False, True])
e.dtype
Explanation: Bool
End of explanation
f = np.array(['Bonjour', 'Hello', 'Hallo',])
f.dtype     # <--- strings containing max. 7 letters
Explanation: Строки
На строки память выделяется "жадно" - по максимальному числу литер в строке. 
В этом примере на каждую строку выделяется по 7 литер, и тип данных - 'S7'
End of explanation
%pylab inline
Explanation: Основы визуализации
$ ipython notebook --pylab=inline
Или из тетрадки:
End of explanation
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) 
Explanation: Параметр inline говорит серверу IPython о том, что результаты будут отображаться в самой тетрадке, а не в новом окне. 
Импортируем Matplotlib
End of explanation
plot(x, y)       # line plot    
Explanation: Или с использованием pylab:
End of explanation
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    
Explanation: Использование import matplotlib.pyplot as plt рекомендуется для скриптов, а pylab - в тетрадках IPython.
Отображение одномерных массивов:
End of explanation
image = np.random.rand(30, 30)
plt.imshow(image, cmap=plt.cm.hot)    
plt.colorbar()    
Explanation: Отображение двухмерных массивов (например, изображений):
End of explanation
a = np.arange(10)
a
a[0], a[2], a[-1]
Explanation: Индексирование массивов и срезы
В целом так же, как со встроенными последовательностями Python (например, как со списками).
End of explanation
a[::-1]
Explanation: Работает и популярный в Python способ отражения массива:
End of explanation
a = np.diag(np.arange(3))
a
a[1, 1]
a[2, 1] = 10 # third line, second column
a
a[1]
Explanation: Для многомерных массивов индексы - это кортежи целых чисел
End of explanation
a = np.arange(10)
a
a[2:9:3] # [start:end:step]
Explanation: Срезы
End of explanation
a[:4]
Explanation: Последний индекс не включается
End of explanation
a[1:3]
a[::2]
a[3:]
Explanation: По умолчанию `start` -  0,
`end` - индекс последнего элемента, `step` - 1:
End of explanation
a = np.arange(10)
a[5:] = 10
a
b = np.arange(5)
a[5:] = b[::-1]
a
Explanation: Можно совмещать присваивание и срез:
End of explanation
from IPython.display import Image
Image(filename='../img/prime-sieve.png')
Explanation: Пример. Матрица делителей
Отобразить матрицу, в которой вычеркивается (x, y), если y делится на x.
End of explanation
is_prime = np.ones((100,), dtype=bool)
Explanation: Создадим массив is_prime, заполненний значениями True
End of explanation
is_prime[:2] = 0
Explanation: Вычеркнем 0 и 1 как не являющиеся простыми:
End of explanation
N_max = int(np.sqrt(len(is_prime)))
for j in range(2, N_max):
    is_prime[2*j::j] = False
    
is_prime
Explanation: Для каждого натурального j начиная с  2, "вычеркнем" числа, ему кратные:
End of explanation
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
Explanation: Индексирование масками
End of explanation
a[a % 3 == 0] = -1
a
Explanation: Индексирование маской может быть очень полезным для присваивания значений части элементов массива:
End of explanation
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]
Explanation: Индексирование массивом целых чисел
End of explanation
<END_TASK>