Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Численные алгоритмы. Матричные вычисления
Срезы
Объекты-массивы Numeric используют расширенный синтаксис выделения среза. Следующие примеры иллюстрируют различные варианты записи срезов. Функция Numeric.arrayrange() является аналогом range() для массивов.
>>> import Numeric >>> a = Numeric.arrayrange(24) + 1 >>> a.shape = (4, 6) >>> print a # исходный массив [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12] [13 14 15 16 17 18] [19 20 21 22 23 24]] >>> print a[1,2] # элемент 1,2 9 >>> print a[1,:] # строка 1 [ 7 8 9 10 11 12] >>> print a[1] # тоже строка 1 [ 7 8 9 10 11 12] >>> print a[:,1] # столбец 1 [ 2 8 14 20] >>> print a[-2,:] # предпоследняя строка [13 14 15 16 17 18] >>> print a[0:2,1:3] # окно 2x2 [[2 3] [8 9]] >>> print a[1,::3] # каждый третий элемент строки 1 [ 7 10] >>> print a[:,::-1] # элементы строк в обратном порядке [[ 6 5 4 3 2 1] [12 11 10 9 8 7] [18 17 16 15 14 13] [24 23 22 21 20 19]]
Срез не копирует массив (как это имеет место со списками), а дает доступ к некоторой части массива. Далее в примере меняется на 0 каждый третий элемент строки 1:
>>> a[1,::3] = Numeric.array([0,0]) >>> print a [[ 1 2 3 4 5 6] [ 0 8 9 0 11 12] [13 14 15 16 17 18] [19 20 21 22 23 24]]
В следующих примерах находит применение достаточно редкая синтаксическая конструкция: срез с многоточием ( Ellipsis ). Многоточие ставится для указания произвольного числа пропущенных размерностей ( :,:,...,:):
>>> import Numeric >>> a = Numeric.arrayrange(24) + 1 >>> a.shape = (2,2,2,3) >>> print a [[[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]] [[[13 14 15] [16 17 18]] [[19 20 21] [22 23 24]]]] >>> print a[0,...] # 0-й блок [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]] >>> print a[0,:,:,0] # срез по первой и последней размерностям [[ 1 4] [ 7 10]] >>> print a[0,...,0] # то же, но с использованием многоточия [[ 1 4] [ 7 10]]
Универсальные функции
Модуль Numeric определяет набор функций для применения к элементам массива. Функции применимы не только к массивам, но и к последовательностям (к сожалению, итераторы пока не поддерживаются). В результате получаются массивы.
Перечисленные функции являются объектами типа ufunc и применяются к массивам поэлементно. Эти функции имеют специальные методы:
accumulate() | Аккумулирование результата. |
outer() | Внешнее "произведение". |
reduce() | Сокращение. |
reduceat() | Сокращение в заданных точках. |
Пример с функцией add() позволяет понять смысл универсальной функции и ее методов:
>>> from Numeric import add >>> add([[1, 2], [3, 4]], [[1, 0], [0, 1]]) array([[2, 2], [3, 5]]) >>> add([[1, 2], [3, 4]], [1, 0]) array([[2, 2], [4, 4]]) >>> add([[1, 2], [3, 4]], 1) array([[2, 3], [4, 5]]) >>> add.reduce([1, 2, 3, 4]) # т.е. 1+2+3+4 10 >>> add.reduce([[1, 2], [3, 4]], 0) # т.е. [1+3 2+4] array([4, 6]) >>> add.reduce([[1, 2], [3, 4]], 1) # т.е. [1+2 3+4] array([3, 7]) >>> add.accumulate([1, 2, 3, 4]) # т.е. [1 1+2 1+2+3 1+2+3+4] array([ 1, 3, 6, 10]) >>> add.reduceat(range(10), [0, 3, 6]) # т.е. [0+1+2 3+4+5 6+7+8+9] array([ 3, 12, 30]) >>> add.outer([1,2], [3,4]) # т.е. [[1+3 1+4] [2+3 2+4]] array([[4, 5], [5, 6]])
Методы accumulate(), reduce() и reduceat() принимают необязательный аргумент - номер размерности, используемой для соответствующего действия. По умолчанию применяется нулевая размерность.
Универсальные функции, помимо одного или двух необходимых параметров, позволяют задавать и еще один аргумент, для приема результата функции. Тип третьего аргумента должен строго соответствовать типу результата. Например, функция sqrt() даже от целых чисел имеет тип Float.
>>> from Numeric import array, sqrt, Float >>> a = array([0, 1, 2]) >>> r = array([0, 0, 0], Float) >>> sqrt(a, r) array([ 0. , 1. , 1.41421356]) >>> print r [ 0. 1. 1.41421356]
Предупреждение: Не следует использовать в качестве приемника результата массив, который фигурирует в предыдущих аргументах функции, так как при этом результат может быть испорчен. Следующий пример показывает именно такой вариант: >>> import Numeric >>> m = Numeric.array([0, 0, 0, 1, 0, 0, 0, 0]) >>> add(m[:-1], m[1:], m[1:]) array([0, 0, 1, 1, 1, 1, 1]) В таких неоднозначных случаях необходимо использовать промежуточный массив. |