Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 24084 / 1831 | Оценка: 4.18 / 3.71 | Длительность: 16:10:00
ISBN: 978-5-9556-0109-0
Лекция 5:

Численные алгоритмы. Матричные вычисления

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

Срезы

Объекты-массивы 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 определяет набор функций для применения к элементам массива. Функции применимы не только к массивам, но и к последовательностям (к сожалению, итераторы пока не поддерживаются). В результате получаются массивы.

Функция Описание
add(x, y), subtract(x, y) Сложение и вычитание
multiply(x, y), divide(x, y) Умножение и деление
remainder(x, y), fmod(x, y) Получение остатка от деления (для целых чисел и чисел с плавающей запятой)
power(x, y) Возведение в степень
sqrt(x) Извлечение корня квадратного
negative(x), absolute(x), fabs(x) Смена знака и абсолютное значение
ceil(x), floor(x) Наименьшее (наибольшее) целое, большее (меньшее) или равное аргументу
hypot(x, y) Длина гипотенузы (даны длины двух катетов)
sin(x), cos(x), tan(x) Тригонометрические функции
arcsin(x), arccos(x), arctan(x) Обратные тригонометрические функции
arctan2(x, y) Арктангенс от частного аргумента
sinh(x), cosh(x), tanh(x) Гиперболические функции
arcsinh(x), arccosh(x), arctanh(x) Обратные гиперболические функции
exp(x) Экспонента ( ex )
log(x), log10(x) Натуральный и десятичный логарифмы
maximum(x, y), minimum(x, y) Максимум и минимум
conjugate(x) Сопряжение (для комплексных чисел)
equal(x, y), not_equal(x, y) Равно, не равно
greater(x, y), greater_equal(x, y) Больше, больше или равно
less(x, y), less_equal(x, y) Меньше, меньше или равно
logical_and(x, y), logical_or(x, y) Логические И, ИЛИ
logical_xor(x, y) Логическое исключающее ИЛИ
logical_not(x) Логические НЕ
bitwise_and(x, y), bitwise_or(x, y) Побитовые И, ИЛИ
bitwise_xor(x, y) Побитовое исключающее ИЛИ
invert(x) Побитовая инверсия
left_shift(x, n), right_shift(x, n) Побитовые сдвиги влево и вправо на n битов

Перечисленные функции являются объектами типа 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])

В таких неоднозначных случаях необходимо использовать промежуточный массив.

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Павел Ялганов
Павел Ялганов

Скажите экзамен тоже будет ввиде теста? или там будет какое то практическое интересное задание?