580 likes | 1.03k Views
Востокова Елизавета 222 гр. NumPy , SciPy. NumPy. это расширение языка Python, добавляющее поддержку больших многомерных массивов и матриц, вместе с большой библиотекой математических функций для операций с этими массивами. История возникновения NumPy. Numeric – был создан в 1995 году
E N D
Востокова Елизавета 222 гр. NumPy, SciPy
NumPy • это расширение языка Python, добавляющее поддержку больших многомерных массивов и матриц, вместе с большой библиотекой математических функций для операций с этими массивами.
История возникновения NumPy Numeric – был создан в 1995 году медленно работает на больших массивах (рабочий, но устаревший) Numarray – новая версия Numeric (сейчас так же устаревший) NumPy – объединение Numeric и Numarray Последняя версия NumPy version 1.3.0, выпущена 5 Апреля 2009 года и поддерживает Python 2.6
Массив • Содержит элементы только одного типа • Может быть многомерным • Операции с массивами в NumPy выполняются поэлементно
Чем массивы NumPy(SciPy)лучше списков*** • Массивы работают быстрее • Более функциональны
Пример использования массива (1) Массив вложенных массивов: from numarray import * pyarr = [[1,2,3], [4,5,6], [7,8,9]] printpyarr #[[1, 2, 3], [4, 5, 6], [7, 8, 9]] pyarr [1] [1] = 0 print pyarr #[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
Пример использования массива (2) from numarray import * numarr = array(pyarr) print numarr #[[1 2 3] # [4 0 6] # [7 8 9]]
Пример использования массива (3) Поэлементные операции: numarr2 = numarr * 2 print numarr2 #[[ 2 4 6] #[ 8 0 12] #[14 16 18]] print numarr2 + numarr #[[ 3 6 9] #[12 0 18] #[21 24 27]]
Пример использования массива (4) Изменение «формы» массива: numarr2.shape = (9,) print numarr2 #[ 2 4 6 8 0 12 14 16 18]
Примеры тригонометрических функций • numpy.arccos() from numpy import * arccos(array([0, 1])) #array([ 1.57079633, 0. ]) • numpy.arcsin(...) from numpy import * arcsin(array([0, 1])) #array([ 0. , 1.57079633]) tan(), sin()
Array2string() Возвращает строковое представление массива: x = np.array([1e-16,1,2,3]) print np.array2string(x, precision=2, separator=',',suppress_small=True) #[ 0., 1., 2., 3.] array_repr() == array_str() == array2string()
Аrray_equal() Сравнение массивов (поэлементное). Возвращает значения True or False. • np.array_equal([1,2],[1,2]) #True • np.array_equal([1,2],[1,2,3]) #False • np.array_equal([1,2],[1,4]) #False
Array_split() Разбивает массив на несколько равных частей x = np.arange(8.0) np.array_split(x, 3) #[array([ 0., 1., 2.]), array([ 3., 4., 5.]), # array([ 6., 7.])]
Аsfarray() Возвращает массив со значениями Float • np.asfarray([2, 3]) #array([ 2., 3.]) • np.asfarray([2, 3], dtype='float') #array([ 2., 3.])
Conj() Возвращает числу комплексно сопряженное ему. np.conjugate(1+2j) #(1-2j)
Degrees(), radians() • Преобразовывает углы из радиан в градусы np.degrees(np.pi/2) #90.0 • Преобразовывает углы из градусов в радианы np.radians(180) #3.1415926535897931
Diag() Выписывает диагональные элементы массива (матрицы): from numpy import * a = arange(12).reshape(4,3) print a #[[ 0 1 2] #[ 3 4 5] #[ 6 7 8] #[ 9 10 11]] print diag(a,k=0) #[0 4 8] print diag(a,k=1) #[1 5]
Flatten() Сворачивает любой массив в одномерный from numpy import * a = array([[[1,2]],[[3,4]]]) print a #[[[1 2]] #[[3 4]]] b = a.flatten() # b - одномерный printb #[1 2 3 4]
Fliplr() Разворачивает каждую строку массива from numpy import * a = arange(12).reshape(4,3) print a #array([[ 0, 1, 2], #[ 3, 4, 5], #[ 6, 7, 8], #[ 9, 10, 11]]) fliplr(a) # flip left-right #array([[ 2, 1, 0], #[ 5, 4, 3], #[ 8, 7, 6], #[11, 10, 9]])
Flipud() Разворачивает массив сверху вниз from numpy import * a = arange(12).reshape(4,3) print a #array([[ 0, 1, 2], #[ 3, 4, 5], #[ 6, 7, 8], #[ 9, 10, 11]]) flipud(a) # flip up-down #array([[ 9, 10, 11], #[ 6, 7, 8], #[ 3, 4, 5], #[ 0, 1, 2]])
Identity() Возвращает массив с единицами на главной диагонали from numpy import * identity(3,float) #array([[ 1., 0., 0.], #[ 0., 1., 0.], #[ 0., 0., 1.]])
Inv() Вычисляет обратную матрицу from numpy import * from numpy.linalg import inv a = array([[3,1,5],[1,0,8],[2,1,4]]) print a #[[3 1 5] #[1 0 8] #[2 1 4]] inva = inv(a) # Обращает матрицу print inva #[[ 1.14285714 -0.14285714 -1.14285714] #[-1.71428571 -0.28571429 2.71428571] #[-0.14285714 0.14285714 0.14285714]] dot(a,inva) # Проверяет результат #array([[ 1.00000000e-00, 2.77555756e-17, 3.60822483e-16], #[ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], #[ -1.11022302e-16, 0.00000000e+00, 1.00000000e+00]])
logical_and(), logical_not(), logical_or() Операции выполняются поэлементно. • from numpy import * logical_and(array([0,0,1,1]), array([0,1,0,1])) #array([False, False, False, True], dtype=bool) • x = np.arange(5) np.logical_not(x<3) #array([False, False, False, True, True],dtype=bool) • x = np.arange(5) np.logical_or(x < 1, x > 3) #array([ True, False, False, False, True], dtype=bool)
max(), min() Возвращает максимальное (минимальное) значение массива from numpy import * a = array([10,20,30]) a.max() #30 a = array([[10,50,30],[60,20,40]]) a.max() #60 a.max(axis=0) # находит максимум в каждом столбце #array([60, 50, 40]) a.max(axis=1) # находит максимум в каждой строке #array([50, 60])
Random_integers() Возвращает произвольные целые значения в заданной области from numpy import * from numpy.random import * random_integers(-1,5,(2,2)) #array([[ 3, -1], #[-1, 0]]) Так же есть random_sample(), которая возвращает произвольные значения в промежутке от 0 до 1.
Unique() При возвращении сортируются уникальные элементы массива или последовательности from numpy import * x = array([2,3,2,1,0,3,4,0]) unique(x) # remove double values #array([0, 1, 2, 3, 4])
Zeros() Создается нулевой массив from numpy import * zeros(5) #array([ 0., 0., 0., 0., 0.]) zeros((2,3), int) #array([[0, 0, 0], #[0, 0, 0]])
SciPy Это открытая библиотека высококачественных научных инструментов для языка программирования Python.
Модули Содержит модули для: • Оптимизации • Интегрирования • Специальных функций • Обработки сигналов • Обработки изображений • Генетических алгоритмов • Решения обыкновенных дифференциальных уравнений • И других задач
Структуры данных Основной структурой данный в SciPy является многомерный массив реализованный модулем NumPy.
Массивы в SciPy. Создание массивов. scipy.array(alist): создаёт n-мерный массив из списка Пример: a = scipy.array([[1,2,3],[4,5,6]]) b = scipy.array([i*i for i inrange(100) if i%2==1]) c = b.tolist() # конвертирует массив обратно в список
Создание массивовМассив из нулей • scipy.zeros(shape, dtype=float): создаёт n-мерный массив заданной формы, заполненный нулями заданного типа • a = scipy.zeros(100) # 100 элементный массив нулей, тип float • b = scipy.zeros((2,8), int) # массив нулей размера 2x8 типа int • c = scipy.zeros((N,M,L), complex) # массив нулей NxMxL тип complex
Создание массивовМассив из единиц • scipy.ones(shape, dtype=float): создаёт n-мерный массив заданной формы, заполнены единицами заданного типа • a = scipy.ones(10, int) # 10 элементный массив единиц типа int • b = scipy.pi * scipy.ones((5,5)) # хороший способ заполнить массив заданным значением
Создание массивов Единичная матрица • scipy.eye(shape, dtype=float) • id = scipy.eye(10,10) # 10x10 единичная матрица (единицы по диагонали) • offdiag = scipy.eye(10,10,1)+scipy.eye(10,10,-1) # единицы по сдвинутой от центра диагонали
Создание массивовТранспонирование массива • scipy.transpose(a) # транспонирует массив • b = scipy.transpose(a) # заменяет строки на столбцы для двумерной матрицы (транспонирование), и заменяет оси друг на друга для размерностей больше 2х. • b = a.T # эквивалентно scipy.transpose(a) • c = scipy.swapaxes(a, axis1, axis2) # меняет местами заданные оси
Создание массивовСоздание случайного массива • scipy.random создание случайного массива • a = scipy.random.random((100,100)) # массив размера 100x100 содержащий значения типа float равномерно распределенные на интервале [0.,1.) • b = scipy.random.randint(0,10, (100,)) # 100 значений формата int равномерно распределённых на интервале [0, 10), то есть не включающем верхней границы - 10 • c = scipy.random.standard_normal((5,5,5)) # стандартное нормальное распределение (среднее=0, стандартное отклонение =1) в массиве 5x5x5
Индексирование массивов • Многомерное индексирование elem = a[i, j, k] # эквивалентно a[i][j][k] но более эффективно • "Отрицательное" индексирование (начинается с конца массива) last_elem = a[-1] # последний элемент массива
Массивы как индексы • i = scipy.array([0,1,2,1]) # массив индексов для первой оси • j = scipy.array([1,2,3,4]) # массив индексов для второй оси • a[i,j] # возвращает массив ([a[0,1], a[1,2], a[2,3], a[1,4]]) • b = scipy.array([True, False, True, False]) • a[b] # возвращает массив ([a[0], a[2]]) поскольку только b[0] и b[2] являются True
Срезы массивов Срез определенного подблока: • section = a[10:20, 30:40] # 10x10 подблок начинающийся в [10,30] Захватить все до начала/конца массива: • asection = a[10:, 30:] # отсутствие завершающего индекса подразумевает "до конца массива" • bsection = b[:10, :30] # отсутствие стартового индекса подразумевает "до начала массива"
Срезы массивов Захватить всю колонку(ки) • x = a[:, 0] # взять все значения из нулевой колонки (нет ни начала ни конца, то есть берем все строки) • y = a[:, 1] # взять все значения из первой колонки (соответственно все строки) Срезать хвост массива • tail = a[-10:] # получить последние 10 элементов массива • slab = b[:, -10:] # получить блок шириной 10 с "боку" массива • interior = c[1:-1, 1:-1, 1:-1] # вырезать все кроме внешней "оболочки"
Поэлементные действия с массивамиАрифметические операции • c = a + b # сложить a и b поэлементно • d = e * f # перемножить e и f поэлементно • g = -h # меняет знак каждого элемента h • y = (x+1)%2 # меняет местами нули и единицы в бинарном массиве x
Тригонометрические операции • y = scipy.sin(x) # синус каждого элемента x • z = scipy.exp((0.+1.j) * theta) # exp(i * theta) где i = sqrt(-1) = 0.+1.j
Суммирование массивовПростое суммирование • s = scipy.sum(a) # сумма всех элементов a, возвращает скаляр • s0 = scipy.sum(a, axis=0) # сумма элементов вдоль определенной оси (=0), возвращает массив оставшейся формы например: • a = scipy.ones((10,20,30)) • s0 = scipy.sum(a, axis=0) # s0 имеет форму (20,30)
Суммирование массивовОсреднение • m = scipy.mean(a, axis) # вычисляет среднее вдоль определенной оси (если axis = None, осреднение происходит по всему массиву)
Другие полезные функции при работе с массивами в SciPy • scipy.any(a): возвращает True если любой из элементов a является True • scipy.all(a): возвращает True если все элементы a являются True • scipy.alltrue(a, axis): применяет ЛОГИЧЕСКОЕ И вдоль заданной оси a • scipy.append(a, values, axis): добавляет значения к a вдоль заданной оси • scipy.concatenate((a1, a2, ...), axis): объединяет кортеж массивов вдоль определенной оси • scipy.min(a, axis=None), scipy.max(a, axis=None): выдает min/max значения вдоль определенной оси (по всему массиву если axis=None) • scipy.argmin(a, axis=None), scipy.argmax(a, axis=None): выдает индексы значений min/max массива a вдоль определенной оси (для всего массива если axis=None)
Другие полезные функции при работе с массивами в SciPy • scipy.reshape(a, newshape): изменяет форму массива (общее количество элементов массива должно сохраняться) • scipy.matrix(a): создает матрицу из двухмерного массива a (в матрицах реализовано матричное умножение вместо поэлементного умножения) • scipy.around(a, decimals=0): округляет элементы массива до определенного количества знаков после запятой • scipy.sign(a): возвращает массив такой же формы как a, с -1 где a < 0, 0 где a = 0, и +1 где a > 0
Другие полезные функции при работе с массивами в SciPy • scipy.fliplr(a): перевернуть массив слева на право • scipy.flipud(a): перевернуть массив сверху вниз • a = a[:,:,:,::-1] - перевернуть одну из осей массива любой размерности
Демонстрация работыФункция Бесселя
Демонстрация работыОтрисовка функции Бесселя from scipy import optimize, special fromnumpy import * frompylab import * x = arange(0,10,0.01) fork in arange(0.5,5.5): y = special.jv(k,x) plot(x,y) f = lambda x: -special.jv(k,x) x_max = optimize.fminbound(f,0,6) plot([x_max], [special.jv(k,x_max)],'ro') title('Different Bessel functions and their local maxima') show()
Доступные субпакеты • constants: Физические константы и коэффициенты пересчёта (с версии 0.7.0[1]) • cluster: Векторное квантование • fftpack: Дискретные алгоритмы преобразования Фурье • integrate: Инструменты для интегрирования • interpolate: Инструменты для интерполяции • io: Ввод/вывод данных • lib: Врапперы Python для внешних библиотек • linalg: Линейная алгебра • misc: Разные утилиты • optimize: Средства оптимизации • sandbox: Экспериментальный код • signal: Обработка сигналов • sparse: Поддержка разреженных матриц • special: Специальные функции • stats: Статистические функции • weave: Позволяет включение кода C/C++ внутри кода Python