<jupyter_start><jupyter_text>Numpy<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>1. А нафига её написали?<jupyter_code>a = [1, 2, 3]
b = [4, 5, 8]
type(a)
a + b
3*a
a = np.array([1, 2, 3])
b = np.array([4, 5, 8])
type(a)
a
a + b
3*a
a@b # матричное умножение (для векторов скалярное <a,b> )
np.dot(a, b)
x = np.arange(10**7)
x
y = list(x)
y[-10:]
%%timeit
np.sum(x)
%%timeit
sum(y)
957/6<jupyter_output><empty_output><jupyter_text>2. Функционал!<jupyter_code>x = np.array([1, -2, 3, -4, 5])
x
x.shape
x.size
x[3]
x[3:]
x > 0  # маска 
x[x > 0] # оставил только те элементы, где было True
A = np.array([[22, 42, 52 ], [3, 5, 2], [-5, 8, 11]])
A
A.shape
A.size
A[2,2]
A[2] # строка матрицы
A[:,2] # столбец из матрицы
A >= 5
A[A >= 5]
A[A < 5] = 0
A
A[1,1] = 55
A
np.zeros((4,4))
B = np.ones((2,2,2))
B.shape
B
A
B = np.random.normal(size=(3,2))
B
A@B
np.dot(A, B)
B@A
np.hstack((A,B))
np.vstack((A,B))
B.T
np.vstack((A,B.T))
np.linalg.det(A) # определитель
np.linalg.eig(A) 
np.eye(3)
D = np.linalg.inv(A)
D
A@D
np.abs(A@D - np.eye(3)).sum() < 1e-15
np.allclose(A@D, np.eye(3))<jupyter_output><empty_output><jupyter_text>$$Ax = b$$<jupyter_code>A
b = np.array([1, 2, 3])
b
x = np.linalg.solve(A,b) # можно решать системы уравнений
x
A@x<jupyter_output><empty_output><jupyter_text>Про оси и размерности<jupyter_code>A
A.sum()
np.sum(A)
# kartoshka - объект

# kartoshka.pojarit( ) # метод 
# pojarit(kartoshka)   # функция
A.sum(axis = 0)
A.sum(axis = 1)
A.min(axis = 0)
B = np.ones((2,2,2))
B
B.sum(axis=2)
B = np.ones((2,2,3))
B
B.reshape(3,4)
B.reshape(2,5)<jupyter_output><empty_output><jupyter_text>3. Решаем задачки __Задача 1__ Реализуйте функцию, возвращающую максимальный элемент в векторе $x$ среди элементов, перед которыми стоит нулевой.Например, для `x = np.array([6, 2, 0, 3, 0, 0, 5, 7, 0])` ответом является `5`. Если нулевых элементов нет, функция должна возвращать `None`.<jupyter_code>x = np.array([6, 2, 0, 3, 0, 0, 5, 7, 0, 2])
x
x == 0
x[x==0]
usl = (x == 0)
usl = usl[:-1]
x[1:][usl].max()<jupyter_output><empty_output><jupyter_text>__Задача 2__Матрица $X$. Нужно пронормировать данные к отрезку $[0;1]$ по столбцам$$x^{*} = \frac{x - min(x)}{max(x) - min(x)}$$<jupyter_code>X = np.random.normal(size=(3,4))
X
X.min(axis = 0)
X
X_scaled = (X - X.min(axis = 0)) / (X.max(axis = 0) - X.min(axis = 0)) 
X_scaled<jupyter_output><empty_output><jupyter_text>А если я хочу вычитать по столбикам?<jupyter_code>X.min(axis = 1)
X - X.min(axis = 1)
(X.T - X.min(axis = 1)).T  # первый выход
X - X.min(axis = 1).reshape(3,1) # вычитать вектор столбец - альтернативный выход
m = X.min(axis = 1)
m
m.shape
m1 = m.reshape(3,1)
m1
m1.shape
m1.T
m1.T.shape
m[:,np.newaxis] # другой способ завести новую размерность 
m[:,None] # другой способ завести новую размерность<jupyter_output><empty_output><jupyter_text>Зачем?<jupyter_code># Миша  50  1.5
# Димма 80  2

X = np.array([[50, 1.5],  [80, 2]])
X
np.sqrt( (80 - 50)**2 + (2 - 1.5)**2 )
(80 - 50)**2 
(2 - 1.5)**2<jupyter_output><empty_output><jupyter_text>Когда полезно ввести новую размерность?<jupyter_code>A = np.random.normal(size=(3,4))
B = np.random.normal(size=(3,4))
A, B<jupyter_output><empty_output><jupyter_text>Я хочу посчитать Евклидово расстояние между каждой строкой из 1 матрицы и каждой строкой из 2 матрицы.<jupyter_code>A - B # не то :(
A[::,None]
A[::,None] - B
np.sqrt( ((A[::,None] - B)**2).sum(axis=2) )
sum([-1.38222184,  0.55138563,  2.40526933, -1.27547724])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.20114285714285715, 'fraction_numerical': 0.06142857142857143, 'mean_word_length': 4.7772277227722775, 'pattern_counts': {'":': 0, '<': 48, '<?xml version=': 0, '>': 50, 'https://': 0, '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': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '349557', 'license': 'MIT', 'n_tokens_mistral': 1933, 'n_tokens_neox': 1924, 'n_words': 369, 'path': 'sem07_numpy/sem07_204.ipynb', 'repo_name': 'hse-econ-data-science/dap_2021_spring', 'size': '3500'}