import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (16,8)
Массив можно создать из списка.
arr = np.array([1,3,4,7,12])
arr
arr = np.array([1,3,4,7,12.0])
arr
arr = np.array([1,3,4,'7',12.0])
arr
Но наиболее распространены создания "с нуля"
arr = np.arange(0, 12, 0.7) # расширение функции range()
arr
arr = np.linspace(0, 12, 20) # равномерно распределенные 20 чисел от 0 до 12
arr
# Массив из "1"
arr = np.ones(7)
print arr
arr = np.ones(7, dtype=int)
print arr
# Массив из "0"
arr = np.zeros(7)
# Массив из чего хотите
arr = np.full(7, np.exp(1), )
arr
A = np.array([[3, 1, 4], [1, 5, 9], [2, 6, 5], [4, 1, 1]])
print A.shape
print A.size
print A.ndim
Форму массива (shape
) можно менять, но так, чтобы это согласовывалось с его размером (size
)
A = A.reshape((6,2))
A
A = A.flatten()
A
#!!!
# Это не тоже самое, что A = A.reshape((1, 12))
A = A.reshape((3,-1))
A
# -1 как бы означает, "сделай первую размерность равную 3,
# а все остальное запихни во вторую, если получится
A.T # Транспонирование матрицы
Довольно стандартная и интуитивно понятная
arr = np.arange(0, 19, 3)
arr
arr[3]
arr[:3]
arr[3:5]
arr[::3] #?!
arr[-2:] #?!
Задание
Догадайтесь, как вывести массив в обратном порядке?
print arr>10
print arr[arr>10]
arr[[1,3,2]]
На многомерные массивы (матрицы) все распространяется точно также.
A = np.random.randint(0, 20, (5,6))
A
# Небольшое дополнение
print A[:, 2]
print A[2, :]
A[A>5]
Тут все тоже довольно просто
arr = np.arange(1,6, dtype=float)
arr
1/arr
arr * 2
arr // 2
bar = np.arange(6,1,-1)
bar
arr + bar
arr * bar
arr ** bar
# Матричное умножение (скалярное произведение)
arr.dot(bar)
В numpy
реализовано много математических функций
np.log(arr)
np.sqrt(arr)
a = np.random.randint(0, 10, (2, 5))
b = np.random.randint(0, 10, (2, 5))
print a
print b
A = np.r_[a,b]
A
A = np.concatenate((a,b), axis=0)
A
A = np.c_[a,b]
A
A = np.concatenate((a,b), axis=1)
A
Массивы можно аггрегировать - считать среднее значение, медиану, моду, максимум, минимум, сумму и тп
arr = np.random.rand(11)
arr
print np.mean(arr)
print arr.mean()
arr.sum()
print 'максимальное значение %.4f находится на %d позиции' % (arr.max(), arr.argmax())
# аналогично argmax, есть argmin и argsort
np.median(arr)
np.percentile(arr, [15, 85])
Что касается матриц - то в них все примерно тоже самое.
A = np.random.rand(3,5)
A
A.mean()
A.mean(axis=0)
A.mean(axis=1)
Задание
Задайте два случайных массива (вектора) $a$ и $b$ одинаковой длины.
Вычислите следующие расстояния между массивами:
## Your code here
Задание
Сгенерируйте такой случайный вектор (np.random.rand()
) длины 10, что сумма его элементов равна 2.
## Your code here
Задание
Сгенерируйте случайный вектор (np.random.rand()
) длины 100. Выполните такое преобразование массива, что
## Your code here
Задание
Сгенерируйте случайный вектор длины 20 из целых чисел на интервале [0,50]. Оставьте в нем только те элементы что меньше 5 персентиля и больше 95 персентиля
## Your code here
Задание
Сгенерируйте случайную матрицу размера $5 \times 6$ из целых чисел на интервале [0,50]. Выведите столбец с содержащий максимальное значение во всей матрице.
## Your code here
В numpy
есть специальные обозначения для бесконечности и пропущенных значений.
В реальном мире приходится работать с очень "грязными" данными и частенько бывает, что какие-то измерения, значения признаков и тп просто отсутствуют. К этому надо быть готовым
np.log(0)
np.log(-1)
np.nan
arr = np.random.rand(10)
idx = np.random.randint(0, 10, 4)
arr[idx] = np.nan
arr
# проверяем, является ли значение пропущенным
is_nan = np.isnan(arr)
# проверяем, есть ли хотя бы одно пропущенное
np.any(is_nan)
# проверяем, есть ли хотя бы одно пропущенное
np.all(is_nan)
Аггрегация массивов с пропущенными значениями может выполняться без учета np.nan
print np.nanmean(arr)
print np.mean(arr)
Задание
Замените все пропущенные значение средним
## Your code here
Загрузите файл 1 и файл 2 в папку с тетрадкой. С помощью функции loadtxt
в модуле numpy
загрузите табличные данные одного из файлов. Присвойте y = D[:,0] а X = D[:, 1:].
Сейчас мы воспользуемся одной магической формулой и построим модель линейной регрессии. Откуда эта формула берется мы узнаем на следующих занятиях.
Модель линейной регрессии в матричном виде выглядит так: $\hat{y} = X\hat{\beta}$, где
$$ \hat{\beta} = (X^\top X)^{-1} X^\top y $$Остатки модели рассчитываются как $$ \text{res} = y - \hat{y} $$
Итак, еще раз:
Задание
# load data
D = np.loadtxt('tutorial_dataset_1.csv',
skiprows=1,
delimiter=',')