Простой Python. Современный стиль программирования (Любанович) - страница 258

>>>> l

>[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]

>>>> l[1,2]

>Traceback (most recent call last):

>··File "", line 1, in

>TypeError: list indices must be integers, not tuple

>>>> l[1][2]

>7

Еще один момент: разбиение работает, но опять же только внутри множества, заключенного в один набор квадратных скобок. Снова создадим привычный проверочный массив:

>>>> a = np.arange(10)

>>>> a = a.reshape(2, 5)

>>>> a

>array([[0, 1, 2, 3, 4],

>·······[5, 6, 7, 8, 9]])

Используйте разбиение, чтобы получить первый ряд — элементы начиная со смещения 2, до конца:

>>>> a[0, 2:]

>array([2, 3, 4])

Теперь получим последний ряд — все элементы вплоть до третьего с конца:

>>>> a[-1,3]

>array([5, 6, 7])

Вы также можете присвоить значение более чем одному элементу с помощью разбиения. Следующее выражение присваивает значение 1000 колонкам (смещениям) 2 и 3 каждого ряда:

>>>> a[:, 2:4] = 1000

>>>> a

>array([[···0,····1, 1000, 1000,····4],

>·······[···5,····6, 1000, 1000,····9]])

Математика массивов

Создание и изменение формы массивов так нас увлекли, что мы почти забыли сделать с ними что-то более полезное. Для начала используем переопределенный в NumPy оператор умножения (*), чтобы умножить все значения массива за раз:

>>>> from numpy import *

>>>> a = arange(4)

>>>> a

>array([0, 1, 2, 3])

>>>> a *= 3

>>>> a

>array([0, 3, 6, 9])

Если вы пытались умножить каждый элемент обычного списка Python на число, вам бы понадобились цикл или включение:

>>>> plain_list = list(range(4))

>>>> plain_list

>[0, 1, 2, 3]

>>>> plain_list = [num * 3 for num in plain_list]

>>>> plain_list

>[0, 3, 6, 9]

Такое поведение применимо также к сложению, вычитанию, делению и другим функциям библиотеки NumPy. Например, вы можете инициализировать все элементы массива любым значением с помощью функции zeros() и оператора сложения:

>>>> from numpy import *

>>>> a = zeros((2, 5)) + 17.0

>>>> a

>array([[17.,··17.,··17.,··17.,··17.],

>·······[17.,··17.,··17.,··17.,··17.]])

Линейная алгебра

NumPy содержит множество функций линейной алгебры. Например, определим такую систему линейных уравнений:

>4x + 5y = 20

>x + 2y = 13

Как мы можем найти х и у? Создадим два массива:

• коэффициенты (множители для х и у);

• зависимые переменные (правая часть уравнения):

>>>> import numpy as np

>>>> coefficients = np.array([[4, 5], [1, 2]])

>>>> dependents = np.array([20, 13])

Теперь используем функцию solve() модуля linalg:

>>>> answers = np.linalg.solve(coefficients, dependents)

>>>> answers

>array([-8.33333333,··10.66666667])

В результате получим, что x примерно равен –8.3, а у примерно равен 10.6. Являются ли эти числа решениями уравнения?