Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования на языке Python. Учебное пособие
.pdf
[[01
234]
[5
6789]
[1
0 11 12 13 14]]
>>> im
port
Num
eric
>>> print Num
eric
.reshape("абракад
абр
", (
5,
-1))
[[
а б]
[р
а]
[к а]
[д а]
[б р]]
>>>а =аrrау([
[1, 2], [3, 4]])
>>> b = a.flat
>>> b
array([1
, 2
, 3
, 4])
>>> b[0
] = 9
>>> b
arra
y([9, 2, 3, 4])
>>> a array
([[9, 2], [3, 4]])
Методы массивов
Придать н
21.3.
ужную форму массиву можно функцией Numeric,
reshape(). Эта функция сразу создает объект-массив нужной формы
из последовательности.
этом примере цифра -1 в указании формы массива говорит
В
о том, что соответствующее значение можно вычислить. Общее количество элементов массива известно (десять), поэтому длину вдоль
одной из размерностей задавать не обязательно. Через атрибут flat
можно получить одномерное представление массива:
Следуе
присваивание значений его элементам приводит к изменениям в исходном массиве. Функция Numeric.resize() похожа на Numer-
ic.reshape(), но может подстраивать число элементов:
т заметить, что это новый вид того же массива, поэтому
51

>>> print Nu
meric.resize("NUMERIC", (3,
2))
[[
N U]
[M E]
[R 111
>>> print Nu
meric.resize("NUMERIC", (3, 4))
[[
N U M E]
[R I
C N]
[U M
E R]]
>>> print Nu
meric.zeros((2,3))
[[0 0
0]
[0
0 0]]
>>> print Nu
meric.ones((2,3))
[[1 1
1]
[1
1 1]]
>>>print Nu
meric.identity(4)
[[1 0
00]
[0
100]
[0
010]
[0
00 1]]
>>> im
port Numeric
>>> а = Num
eric.arrayrange(9)
>>> a.sh
ape = (3, 3)
>>> print a
[[0 1
2]
[3
4 5]
[6
7 8]]
>>> a1 = a.copy()
>>> a1[
0, 1] =
-1
#операция над копией
>>> print a
[[0 1
2]
Фу
нкция Numeric.zeros() порождает массив из одних нулей,
а Numeric.ones() – из одних единиц. Единичную матрицу можно по-
лучить с помощью функции Numeric. identity(n):
Для ко
пирования массивов можно использовать метод copy():
52

[3
4 5]
[6
7 8]]
>>> а.tolist()
[[0, 1, 2], [3
, 4,
5], [6
, 7, 8]]
>>> im
port Numeric
>>> а = Num
eric.arrayrange(24) + 1
>>> a.shape = (4
, 6)
>>> print a
#исхо
дный массив
[[12
3456]
[7
8 9 10 11 12]
[1
3 14 15 16 17 18]
[1
9 20 21 22 23 24]]
>>> print a[
1,2] #
элем
ент
1,2 9
>>> print a[l,:]
#
строка 1
[7
8 9 10 11 12]
>>> print a[l] # тоже с
трока 1
[7
8 9 10 11 12]
>>> print a[:,l]
# столбец 1
[ 2 8
14 20]
>>> print a[-2,:] #пред
последняя строка
[1
3 14 15 16 17 18]
>>> print a[0
:2,1:3]
#окно
2х2
[[2 3]
[8
9]]
>>> print a[l,::3] #к
аждый третий элемент строки 1
[7
10]
>>> print a[:,::-!]#
элементы строк в обратном порядке
выделения среза. Следующие примеры иллюстрируют различные варианты записи срезов. Функция Numeric.arrayrange() является аналогом range() для массивов.
Массив
превращается обратно в список методом tolist():
Объекты-
21.4.
Срезы массивов
массивы Numeric используют расширенный синтаксис
53

[[6 5 4 3 2 1]
[1
2 11 10 9 8 7]
[1
8 17 16 15 14 13]
[2
4 23 22 21 20 19]]
>>>а[1
,::3]=
Num
eric
.array([0
,0])
>>> print a
[[1 2 3 4 5 6]
[0
8 9 0 11 121
[1
3 14 15 16 17 18]
[1
9 20 21 22 23 24]]
>>> im
port Numeric
>>> а = Num
eric.arrayrange(24) + 1
>>> а.shap
e = (2,
2,2,3)
>>> print a
[[[
[ 1 2 3]
[4
5 6]]
[[7 8
9]
[1
0 11 12]]]
[[[13 14 15]
[1
6 17 18]]
[[
19 20 21]
[2
2 23 24]]]]
>>>print a[
0, ...]
# 0-й б
лок
[[[ 1 2 3]
[4
5 6]]
[[
7 8 9]
[1
0 11 12]]]
Срез
не копирует массив (как это имеет место со списками),
а дает доступ к некоторой части массива. Далее в примере меняется
на 0 каждый третий элемент строки 1:
В
следующих примерах находит применение достаточно редкая
синтаксическая конструкция: срез с многоточием (Ellipsis). Многоточие ставится для указания произвольного числа пропущенных размерностей (:, :, ..., : ):
54

>>>print a[0
, :, :,0] #по перв
.и пос
лед
.размерности
[[1 4]
[ 7 1
0]]
>>> print a[0
, ...,0]
#то же,с и
спольз
.много
точия
[[
1 4]
[ 7 1
0]]
Функ
ция
Описание
1
2
add(x,у)
Сложение
sub
tract
(х, у)
Вычитание
mu
ltiply
(х, у)
Умно
жение
div
ide
(х, у)
Деление
rem
ainder(x,
у),f
mod(x,
у)
Полу
чение остатка от деления
(для
целых чисел и чисел с плав
а-
юще
й запятой)
po
wer
(х)
Воз
ведение в степень
sqrt(x)
Извлечен
ие корня квадратного
neg
ative(x), absolute(x),
fab
s(x)
Смена з
нака и абсолютное знач
е-
ние
ceil(x), floor(x)
Наиме
ньшее
(наи
большее) целое,
больш
ее (меньшее) или равное а
р-
гу
менту
hy
pot
(x,у)
Длина гипо
тенузы по двум кат
е-
там: x,y
sin(x),
cos(x), tan(x)
Триго
нометрические функции
arcsin(x),
arccos(x), arctan(x)
Обратны
е тригонометрические
функ
ции
21.5.
Модуль Numeri
Универсальные функции элементов массивов
c определяет набор функций для применения
к элементам массива. Функции применимы не только к массивам, но
и к последовательностям (к сожалению, итераторы пока не поддерживаются). В результате получаются массивы.
55

Окончание таблицы
1
2
arctan2(x,у)
Арктанг
енс от частного аргумента
sinh
(x), cosh(x), tanh(x)
Гипербо
лические функции
arcsinh(x),
arccosh(x),
arctan
h(x)
Обратны
е гиперболические фун
к-
ции
ехр
(х)
Экспонента
log(x) , logl0(x)
Натур
альный и десятичный лог
а-
рифмы
ma
ximum
(х, у)
Максимум
min
imum
(x,у)
Минимум
con
jugate
(x)
Сопряжение
(для комплексных
чисел)
equ
al(
х, у), no
t_equal(x,
у)
Равно,
не равно
greater(х, у), great
er_equal(x,
у)
Больше,
больше или равно
less(x,у
), less_equal(х, у)
Мень
ше, меньше или равно
log
ical_and(x,
у),
log
ical_or(x,
у)
Логические
И, ИЛИ
log
ical
_xor(x,у)
Логическо
е исключающее ИЛИ
log
ical
_not(х)
Логическое НЕ
bitwise_
and(x,
у),
bitwise_
or(x,
у)
Побито
вые И, ИЛИ
bitwise_xor(x,у)
Побито
вое исключающее ИЛИ
inv
ert
(x)
Побито
вая инверсия
left_
shift(
х, n
), right_shift(x, n)
Побитовые сдв
иги влево и вправо
на n битов
В таблице представлены функции модуля Numeric, которые являются краткой записью некоторых наиболее употребительных сочетаний функций и методов. Параметр axis в функциях указывает размерность.
21.6. Функции модуля Num
eric
56

Функ
ция
Анало
г функции
sum
(a, axis)
add
.reduce(a, axis)
cum
sum(a, axis)
add
.accumulate(a, axis)
prod
uct(a, axis)
mu
ltiply.reduce(a, axis)
cum
product(a, axis)
mu
ltiply.accumulate(a, axis)
alltrue(a,
axis)
log
ical_and.reduce(a, axis)
som
etrue(a, axis)
log
ical_or.reduce(a, axis)
>>> im
port Numeric, LinearAlgebra
>>> print
LinearAlgebra.determinant( Numeric.array([[1,
-2],
[1,5]]))
7
>>> im
port Numeric, LinearAlgebra
>>> а = Num
eric.array([[1.0,2.0],[0.0,1.0]])
>>> b = Nu
meric.array([1.2,1.5])
>>> х = Linear
Algebra.solve_linear_equations(a,b)
>>> print "x=", x
x = [-1.8 1
.5]
21.7.
Модуль LinearAlgebra содержит алгоритмы линейной алгебры,
Модуль LinearAlgebra
в частности нахождение определителя матрицы, решений системы
линейных уравнений, обращения матрицы, нахождения собственных
чисел и собственных векторов матрицы, разложения матрицы на
множители.
Функция LinearAlgebra.determinant() находит определитель
матрицы:
Функ
ция LinearAlgebra.solve_linear_equations() решает ли-
нейные уравнения вида ах=b по заданным аргументам а и b:
да матрица а имеет нулевой определитель, система имеет не
Ког
единственное решение и возбуждается исключение LinAlgError:
57

>>> а=Nu
meric.array([[1.0,2.0],[0.5,1.0]])
>>> x=Linea
rAlgebra.solve_linear_equations(a,b)
Traceback
(most recent call last):
File "<std
in>", line
1,
in ?
File "/u
sr/local/lib/python2.3/site
-
packag
es/Numeric/LinearAlgebra.py", line 98, in solve_linear_equations
raise Lin
AlgError, 'Singular matrix' LinearAlgebra.LinAlgError: Sing
u-
lar m
atrix
solv
e_linear_equations(a,Numeric.identity(a.shape[0]))
>>>fro
m Numeric import array, dot
>>>fro
m LinearAlgebra import
*
>>> a=array
([[
-5,2
],[2,
-7]])
>>> lm
d = eigenvalues(a)
>>> print "Собственны
е значения:",lmd
Собственны
е значения: [
-3.76
393202
-8.23
606798]
>>> (lmd, v) = eigen
vectors
(a)
>>> print "Собственны
е вектора:"
Собственные вектора:
>>> print v
[[
0.85065081 0.52573111]
[-0.52
573111 0.85065081]]
>>> print "Про
верка
:", do
t(a,v[0])
– v[
0] * lmd[0]
Про
верка: [
-4.4408
9210
e-16
2.22044605
e-16]
Фу
нкция LinearAlgebra.inverse() находит обратную матрицу.
Однако не следует решать линейные уравнения умножением Lin-
earAlgebra.inverse() на обратную матрицу, так как она определена
через LinearAlgebra.solve_linear_equations():
Функция LinearAlgebra.eigenvalues() находит собственные
значения матрицы, а LinearAlgebra.eigenvectors() – собственные
значения и собственные векторы.
Про
верка показывает, что тождество выполняется с достаточно
большой точностью (числа совсем маленькие, практически нули):
собственные числа и векторы найдены верно.
58

>>>im
port RandomArray
>>>print Ran
domArray.random(10)
#10 псевдослучай
ных
чисел
[0
.28374212 0.19260929 0.07045474 0.305476820.10842083
0.14
049676 0.01347435 0.37043894 0.47362471 0.37673479]
>>> print Rand
omArray.random([3,3])
# м
ассив 3х3 из псевдослучайных чисел
[[
0.53493741 0.44636754 0.20466961]
[ 0.8
911635 0.03570878 0.00965272]
[ 0.7
8490953 0.20674807 0.23657821]]
>>> pron
t RandomArray.randint(1,10,[10])
[8
1 9 9 7 5 2 5 3 2]
>>> print Ran
domArray.randint(1,10,[10])
[2
2 5 5 7 7 3 4 3 7]
>>> print Ran
domArray.permutation(6)
[4
0 1 3 2 5]
>>> print Ran
domArray.permutation(6)
[1
2 0 3 5 4]
21
.8. Модуль RandomArray
В модуле собраны функции для генерации массивов случайных
чисел различных распределений и свойств. Их можно применять для
математического моделирования стохастических систем.
Функция RandomArray.random() создает массивы из псевдослучайных чисел, равномерно распределенных в интервале (0,1):
мерно распределенных чисел из заданного интервала и заданной
формы:
RandomArray.permutation():
Функ
ция RandomArray.randint() для получения массива равно-
Можно
получать и случайные перестановки с помощью
Досту
пны и другие распределения для получения массива нормально распределенных величин с заданным средним и стандартным
отклонением:
59

>>> print RandomArr
ay.normal
(0,1,
30)
[-1.09
44078 1.24862444 0.20415567
-0.74
283403 0.72461408
-
0.57
834256 0.30957144 0.8682853 1.10942173
-0.39
661118
1.33
383882 1.54818618 0.18814971 0.89728773
-0.8614
6659
0.01
84834
-1.462225
91
-0.7842
7434 1.09295738
-1.09
731364
1.34
913492
-0.75
001568
-0.11
239344 2.73692131
-0.19
881676
-
0.49
245331 1.54091263
-1.81
212211 0.46522358
-0.08
338884]
Функ
ция и ее аргументы
Описание
1
2
F(dfn,dfd,shape=[])
F-распред
еление
beta(а,b,shape=[])
Бета-распред
еление
bin
omial
(trials,p,sh
ape
=[])
Би
номиальное распределение
chi_squ
are
(df,shape=[])
Распредел
ение хи
-квадр
ат
exp
onential
(mean, shape=[])
Экспоненц
иальное распред
е-
ление
ga
mma
(a,r,shape=[])
Гамма-распред
еление
mu
ltivar
i-
ate_n
ormal(mean,cov,shape=[])
Много
мерное
нормал
ьное
рас
пределение
neg
ative_binomial(trials,p,
shap
e=[])
Негативное биномиал
ьное
no
ncentral_F(dfn,dfd,nconc,
shap
e=[])
Нецентральное
F-распред
еление
no
ncentral_chi_square(df,
nco
nc, shape=[])
Нецентральное
хи-квадр
ат распреде
-ление
no
rmal(mean,std,shape=[])
Нор
мальное
рас
пределение
per
mutation(n)
Случа
йная
пер
естановка
po
isson(mean,shape=[])
Пуас
соновское
распред
еление
randin
t(min,max=None,shape=[])
Случа
йное
целое
ний.
Следующая
таблица приводит функции для других распределе-
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
