NumPy это open-source модуль для python, который предоставляет общие математические и числовые операции в виде пре-скомпилированных, быстрых функций. Они объединяются в высокоуровневые пакеты. Они обеспечивают функционал, который можно сравнить с функционалом MatLab. NumPy (Numeric Python) предоставляет базовые методы для манипуляции с большими массивами и матрицами. SciPy (Scientific Python) расширяет функционал numpy огромной коллекцией полезных алгоритмов, таких как минимизация, преобразование Фурье, регрессия, и другие прикладные математические техники.
Массивы бывают 1-мерные (вектора) 2-мерные (матрицы) и многомерные (условно тензоры).
Все элементы массива должны принадлежать к одному типу данных.
Создадим одномерный массив из списка при помощи функции array
:
import numpy as np np.array([1, 2, 3])
Создадим двумерный массив из списка при помощи функции array. Обратите внимание на скобки.
np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Но проще создавать массивы при помощи функции arange
.
np.arange(10, 101, 10)
Для создания специфических массивов надо использовать специальные методы. Нарпимер, zeros
создаёт массив нулей.
np.zeros(3)
А метод ones
создаёт массив единиц.
np.ones(3)
Для создания двуменых массивов необходимо передать функции кортеж, первый элемент которого обозначат количество строк, а второй — столбцов.
Для создания массива с необходимым количеством линейнораспределённых элементов из заданного промежутка используется функция linspace
.
np.linspace(10, 100, num=15)
Для создания единично матрицы используется функция eye
. Ей можно задавать смещение.
np.eye(5, k=2)
Можно создавать массивы со случайными числами при помощи функции rand() модуля random.
np.random.rand(4)
Для получения случайных чисел из нормального распределения используем функцию randn() из модуля random. Для создания матрицы случайных чисел надо передать функции два числа, не кортеж
np.random.randn(5)
с равномерным распределением всё похоже
np.random.uniform(10, 100, (3, 3))
np.random.randint(2, 100)
Попробуем узнавать различную информацию о массивах и производить манипуляции с ними при помощи свойств и методов массивов.
arr = np.arange(25)
Размерность массива можно узнать при помощи функции свойства shape.
arr.shape
Свойство dtype возващяет тип переменной.
arr.dtype
matrix = arr.reshape(5, 5) matrix
Также можно находить максимум и минимум при помощи методов max, min, argmax, argmin, счиатать средние значения, стандартные отклонения и многое другое.
arr.std()
arr
В базовом виде работает как в обычном Питоне.
arr[0:11:2]
Для срайсам по различным измерениям многомерных массивов указываем их через запятую
matrix[1:4, :]
arr*3
Но будьте осторожны — тут мы всего лишь создаём ссылки на элементы массива arr с 0 по 5:
a = arr[:5]
a[:] = 9
arr
arr < 10
arr[arr < 10]
+, -, *, /, **, sqrt, exp, sin, log, max, mix, mean и др.: https://docs.scipy.org/doc/numpy-1.13.0/reference/ufuncs.html
Для большинства операций можно указывать ось, по которой она будет производиться:
matrix.sum()
matrix.sum(axis=0) # сумма по столбцам
Кстати говоря, на 0 делить разрешено
2/0
np.array([-1, 2, 3]) / np.array([0, 2, 3])
Напишите функцию decorate_matrix
, которая получает на вход одно целое число больше единицы. Функция должна возвращать матрицу n
на n
, у которой на границах стоят единицы, а на всех остальных позициях(если остались позиции не на границах) стоят нули.
# ожидаемый резальтат для аргумента 5
Создайте массив класса np.ndarray ширины 4 и высоты 3 с двойками на главной диагонали и единицами на первой диагонали над главной, т.е. воплощение матрицы
np.eye(3, M=4) * 2 + np.eye(3, M=4, k=1)
Создайте матрицу чисел от 1 до 25 размерностью 5×5
mat = np.arange(1, 26).reshape(5, 5) mat
Обрежьте её следующим образом:
mat[2: , 2:]
import numpy as np import matplotlib.pylab as plt %matplotlib inline
import numpy as np from matplotlib import pyplot as plt random_image = np.random.random([500, 500]) plt.imshow(random_image, cmap='gray', interpolation='nearest');
import requests with open("lenna.png", "wb") as img_f: img_f.write(requests.get("https://i.stack.imgur.com/nL4u3.png").content) im = plt.imread("lenna.png") im.shape
def plti(im, h=6, **kwargs): """ Helper function to plot an image. """ y = im.shape[0] x = im.shape[1] w = (y/x) * h plt.figure(figsize=(w,h)) plt.imshow(im, interpolation="nearest", **kwargs) plt.axis('off') plti(im)
Удалим прозрачность
im = im[:,:,:3]
Обрежьте изображения до плеча
plti(im[20:200, 0:100, :])
Получите негатив изображения
plti(1 - im)
Сделайте изображение чёрно-белым
plti(np.mean(im, axis=2), cmap='gist_gray')
Поместите жёлтый квадрат 100×100px в верхнем левом углу
im[:100, :100]
im[:5, :5, :]
im[:100, :100, :] = [1, 1, 0] plti(im)
grey = np.zeros((im.shape[0], im.shape[1], im.shape[2])) # init 2D numpy array for rownum in range(len(im)): for colnum in range(len(im[rownum])): a = im[rownum][colnum] + np.random.uniform(-0.2, .2, 1) a[a > .99] = .99 a[a < 0] = 0 grey[rownum][colnum] = a plti(grey)
plti(im + np.random.uniform(0, .3, (220, 220, 3)))
Комментарии