Как составить массив матрицы

На занятии будет рассмотрен двумерный массив в Pascal и примеры работы с ним. Кроме того, предстоит знакомство с понятиями побочная диагональ матрицы в Паскаль и главная диагональ

Содержание:

  • Двумерный массив в Pascal
  • Описание, ввод и вывод элементов двумерного массива
  • Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Матрица или двумерный массив – это прямоугольная таблица чисел (или других элементов одного типа). Каждый элемент матрицы имеет два индекса (номер строки и номер столбца).

матрица

Исходные данные для решения многих задач можно представить в табличной форме:
двумерный массив Pascal
Таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так:

zavod1: array [1..4] of integer;
zavod2: array [1..4] of integer; 
zavod3: array [1..4] of integer;

Или в виде двумерного массива так:

Объявление двумерного массива:

var A: array[1..3,1..4] of integer;
begin
{...}
begin
  var  a := new integer[3,4];
  {...}
end.

Описание, ввод и вывод элементов двумерного массива

Варианты описания двумерного массива (традиционный pascal)

  1. Описание массива в разделе переменных:
  2. const N = 3;
          M = 4;
    var A: array[1..N,1..M] of integer;
  3. Описание массива через раздел type:
  4. const
      M=10;
      N=5;
    type
      matrix=array [1..M, 1..N] of integer;
    var A: matrix;

Ввод двумерного массива m x n с клавиатуры:

ввод двумерного массива

for i:=1 to N do
  for j:=1 to M do begin
    write('A[',i,',',j,']=');
    read ( A[i,j] );
  end;

for var i:=0 to a.RowCount-1 do
  for var j:=0 to a.ColCount-1 do
     a[i,j]:=readinteger;

Заполнение случайными числами:

заполнение случайными числами


var a := MatrRandomInteger(3,4,0,10); // целые числа в диапазоне от 0 до 10
var a1 := MatrRandomReal(3,4,1,9) // веществ. числа в диапазоне от 1 до 9

«Красивый» вывод элементов двумерного массива m x n:

Следующий фрагмент программы выводит на экран значения элементов массива по строкам:
вывод двумерного массива

1
2
3
4
5
for i:=1 to N do begin
  for j:=1 to M do
     write ( A[i,j]:5 );
  writeln;
end;

1
2
3
4
5
6
begin
  var a := MatrRandomInteger(3,4,0,10);
  var a1 := MatrRandomReal(3,4,1,9);
  a.Println;
  a1.Println(6,1) // 6 позиций всего на вывод, 1 знак после десят. запятой
end.

Результат:

   8   2   1   3
   5   8   0   8
   6   3   9   3
   3.3   4.7   3.7   5.4
   2.9   1.7   2.3   4.0
   8.3   3.7   8.4   1.4

Рассмотрим следующую задачу: Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:

Номер станции 1-й день 2-й день 3-й день 4-й день
1 -8 -14 -19 -18
2 25 28 26 20
3 11 18 20 25

Т.е. запись показаний в двумерном массиве выглядела бы так:

t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18;
t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20;
t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25;

Или в pascalabc.NET:

var t := Matr(3,4,-8,-14,-19,-18,25,28,26,20,11,18,20,25);  
t.Println;

Объявление двумерного массива:

var t: array [1..3, 1..4] of integer;

Задание array 1: Необходимо:

  1. Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
  2. Распечатать показания термометров всех метеостанций за 2-й день.
  3. Определить среднюю температуру на 3-й метеостанции.
  4. Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.

Дополните код:

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var t: array [1..3, 1..4] of integer;
s,i,j:integer;
begin
t[1,1]:=-8; 	t[1,2]:=-14; 	t[1,3]:=-19; 	t[1,4]:=-18;
t[2,1]:=25; 	t[2,2]:=28; 	t[2,3]:=26; 	t[2,4]:=20;
t[3,1]:=11; 	t[3,2]:=18; 	t[3,3]:=20; 	t[3,4]:=25;
{1. Распечатать показания термометров на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день}
writeln('1-е задание: ',t[2,4] , ' и ',t[...,...]);
 
{2. Показания термометров всех метеостанций за 2-й день}
for i:=1 to ... do 
   writeln ('2-е задание: ',t[...,...]);
 
{3. Определим среднее значение температуры на 3-й метеостанции:}
i:=3;
s:=0;
for j:=1 to 4 do 
   s:=...; {сумматор}
writeln('3-е задание: ', s/4);
{распечатаем всю таблицу}
for i:=1 to 3 do
    for j:=1 to 4 do
        writeln(t[i,j]);
{4. Распечатаем станции и дни с температурой 24-26 гр}
writeln('4-е задание: ');
for i:=1 to 3 do
    for ... ... do
        if (...) and (...) then
           writeln('станция ', i, ' день ', j)
end.

Самостоятельно подумайте, как находится сумма элементов массива pascal.

Задание array 2. Найти сумму элементов массива (прямоугольной таблицы) размером [m x n]

Задание array 4.
Найти сумму всех элементов массива (переменная sum) 5 x 4, а также сумму элементов, составляющих столбцы таблицы (двумерного массива). Для хранения сумм столбцов чисел использовать одномерный массив (s). Дополните код.
двумерный массив в pascal

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const  m = 5;
       n = 4;
var
    a: array[1..m,1..n] of byte;
    s: array[1..n] of byte;
    i,j, sum: byte;
begin
    randomize;
    for i := 1 to m do begin
        for j := 1 to n do begin
            ... {инициализация элементов массива случайными числами}
            ... {вывод элементов массива}
        end;
        writeln
    end;
    writeln ('------------'); {для оформления}
    {обнуление значений массива суммы s[]:}
    ...
    {поиск сумм элементов по столбцам:}
    for i := 1 to n do begin
         for j := 1 to m do begin
           s[i]:=...;
        end;
     write(...)  ; 
    end;
    {поиск общей суммы:}
    sum:=0;
    ...
    {вычисление суммы элементов массива значений сумм по столбцам:}
    for ...
        ...
    write (' | sum = ', sum);
readln
end.

Задание array 4_1.
Найти сумму элементов двумерного массива [m x n] по строкам:

2 8 1 9  : sum = 20
3 1 7 2  : sum = 13
4 5 6 2  : sum = 17

Методы матриц для работы со строками и столбцами:

begin
  var a := MatrRandomInteger(3,4);  
  a.Println;
 
  a.Row(0).Sum.Println();
  a.Row(1).Average.Println;
  a.Row(2).Product.Println;
 
  a.Col(0).Min.Println;
  a.Col(1).Max.Println;
end.

Результат:

  86  62  80  33
  51   4  36  65
  78  30   5  16
261 
39 
187200 
51 
62 

Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Главная диагональ квадратной матрицы n x n (т.е. той, у которой количество строк равно количеству столбцов) проходит с верхнего левого угла матрицы (элемент 1,1) до правого нижнего угла матрицы (элемент n,n).

Побочная диагональ квадратной матрицы n x n проходит с нижнего левого угла матрицы (элемент n,1) до правого верхнего угла матрицы (элемент 1,n).

Формулу поиска элементов диагоналей проще всего искать, нарисовав элементы матрицы:
Если индексы начинаются с единицы (традиционный Паскаль):

1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4

Если индексы начинаются с нуля (pascalAbc.NET):

0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3

 
Учитывая, что первая цифра в программе будет соответствовать счетчику i, а вторая — счетчику j, то из таблицы можно вывести формулы:

Главная диагональ матрицы в Паскаль имеет формулу:
i=j
Побочная диагональ матрицы в Паскале традиционном имеет формулу:
n=i+j-1 (или j=n-i+1)

где n — размерность квадратной матрицы

Побочная диагональ матрицы в pascalAbc.Net имеет формулу:
n=i+j+1

где n — размерность квадратной матрицы

Пример: Вывести на экран сначала главную диагональ квадратной матрицы из N строк и N столбцов, а затем ее побочную диагональ.

Решение:
Вывод элементов главной диагонали
Вывод элементов побочной диагонали

Пример: Заменить элементы главной и побочной диагонали квадратной матрицы нулями

Показать решение:

Паскаль:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var i,j,n:integer;
a: array[1..100,1..100]of integer;
begin
   randomize;
   writeln ('введите размерность матрицы:');
   readln(n);
   for i:=1 to n do begin
        for j:=1 to n do  begin
            a[i,j]:=random(10);
            write(a[i,j]:3);
        end;
        writeln;
   end;
   writeln;
   for i:=1 to n do begin
        for j:=1 to n do  begin
            if (i=j) or (n=i+j-1) then a[i,j]:=0;
            write(a[i,j]:3)
        end;
        writeln;
   end;
end.

PascalAbc.Net

1
2
3
4
5
6
7
8
9
10
11
12
begin
  var n := readinteger('введите размерность матрицы:');
  var a := matrRandomInteger(n, n, -10, 10);
  a.Println(6);
  for var i := 0 to n - 1 do
  begin
    a[i, i] := 0;
    a[i, n - i - 1] := 0;
  end;
  writeln();
  a.Println(6);
end.

Задание array 5:
Найти отдельно сумму элементов главной и побочной диагонали квадратной матрицы

1 7 3 7
2 1 8 3
5 7 6 4
8 2 3 1
-------
sum1 = 9
sum2 = 30

Пример:
Дана матрица 5х5. Найти сумму элементов, стоящих на двух соседних диагоналях с главной и параллельных ей.
побочная диагональ матрицы паскаль и главная
Для решения задачи воспользуйтесь таблицей

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
A:array[1..5,1..5] of integer;
i,j:integer;
sum,sum1,sum2:integer;
begin
randomize;
for i:=1 to 5 do
for j:=1 to 5 do
    A[i,j]:=random(10);
write ('Исходный массив A: ');
for i:=1 to 5 do begin
    writeln;
    for j:=1 to 5 do
        write (A[i,j]:2,' ');
    end;
sum1:=0;
for i:=1 to 5 do
    for j:=1 to 5 do
        if (i-j=1) then
            sum1:=sum1+A[i,j];
sum2:=0;
for i:=1 to 5 do
    for j:=1 to 5 do
        if (j-i=1) then
           sum2:=sum2+A[i,j];
sum:=sum1+sum2;
writeln;
writeln('Сумма = ',sum);
end.

Задание array 6: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскаль

Задание array 7: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскальдиагонали матрицы Паскаль

Задание array 8: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
диагонали матрицы Паскаль
главная и побочная диагональ матрицы паскаль

Задание array 9: Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить:

  • минимальный элемент, лежащий ниже побочной диагонали;
  • произведение ненулевых элементов последней строки.
  • Рассмотрим еще один пример работы с двумерным массивом.

    Пример: В двумерном массиве размером N х M определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    var index1,index2,i,j,N,M:integer;
    s,min,f:real;
    a:array[1..300,1..300] of real;
    begin
    N:=10;
    M:=5;
    for i:=1 to N do begin
      for j:=1 to M do begin
        a[i,j]:=random(20);
        s:=s+a[i,j];
        write(a[i,j]:3);
       end;
       writeln;
    end;
     
    f:=s/(N*M);
    writeln('srednee znachenie ',f);
    min:=abs(a[1,1]-f);
    for i:=1 to N do begin
      for j:=1 to M do begin
        if abs(a[i,j]-f)<min then begin
          min:=abs(a[i,j]-f);
          index1:=i;
          index2:=j;
        end;
      end;
    end;
    writeln('naibolee blizkiy ',index1,' ',index2);
    end.

    Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

    проверь себя

    Содержание

    • NumPy: матрицы и операции над ними
    • 1. Создание матриц
    • 2. Индексирование
    • 3. Векторы, вектор-строки и вектор-столбцы
    • 4. Datatypes
    • 5. Математические операции
    • 6. Умножение матриц и столбцов
    • 7. Объединение массивов
      • Задания: (Блок 1)
        • Задание 1:
        • Задание 2:
    • 8. Транспонирование матриц
    • 9. Определитель матрицы
    • 10. Ранг матрицы
    • 11. Системы линейных уравнений
    • 12. Обращение матриц
    • 13. Собственные числа и собственные вектора матрицы
    • 14. Расстояния между векторами
      • p-норма
      • 1 норма
      • 2 норма
    • 15. Расстояния между векторами
    • 16. Скалярное произведение и угол между векторами
    • 17. Комплексные числа в питоне
      • Задания: (Блок 2)
        • Задание 3:

    NumPy: матрицы и операции над ними

    Ссылка на jupyter notebook

    В этом ноутбуке из сторонних библиотек нам понадобится только NumPy.
    Для удобства импортируем ее под более коротким именем:

    import numpy as np
    

    1. Создание матриц

    Приведем несколько способов создания матриц в NumPy.

    Самый простой способ — с помощью функции
    numpy.array(list, dtype=None, …).

    В качестве первого аргумента ей надо передать итерируемый объект,
    элементами которого являются другие итерируемые объекты одинаковой длины
    и содержащие данные одинакового типа.

    Второй аргумент является опциональным и определяет тип данных матрицы.
    Его можно не задавать, тогда тип данных будет определен из типа
    элементов первого аргумента. При задании этого параметра будет
    произведена попытка приведения типов.

    Например, матрицу из списка списков целых чисел можно создать следующим
    образом:

    a = np.array([1, 2, 3])   # Создаем одномерный массив
    print(type(a))            # Prints "<class 'numpy.ndarray'>"
    print(a.shape)            # Prints "(3,)" - кортеж с размерностями
    print(a[0], a[1], a[2])   # Prints "1 2 3"
    a[0] = 5                  # Изменяем значение элемента массива
    print(a)                  # Prints "[5, 2, 3]"
    
    b = np.array([[1,2,3],[4,5,6]])    # Создаем двухмерный массив
    print(b.shape)                     # Prints "(2, 3)"
    print(b[0, 0], b[0, 1], b[1, 0])   # Prints "1 2 4"
    print(np.arange(1, 5)) #Cоздает вектор с эелементами от 1 до 4
    
    <class 'numpy.ndarray'>
    (3,)
    1 2 3
    [5 2 3]
    (2, 3)
    1 2 4
    [1 2 3 4]
    
    matrix = np.array([[1, 2, 3], [2, 5, 6], [6, 7, 4]])
    print ("Матрица:n", matrix)
    
    Матрица:
     [[1 2 3]
     [2 5 6]
     [6 7 4]]
    

    Второй способ создания — с помощью встроенных функций
    numpy.eye(N, M=None, …), numpy.zeros(shape, …),
    numpy.ones(shape, …).

    Первая функция создает единичную матрицу размера N×M;
    если M не задан, то M = N.

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

    Примеры:

    b = np.eye(5)
    print ("Единичная матрица:n", b)
    
    Единичная матрица:
     [[1. 0. 0. 0. 0.]
     [0. 1. 0. 0. 0.]
     [0. 0. 1. 0. 0.]
     [0. 0. 0. 1. 0.]
     [0. 0. 0. 0. 1.]]
    
    c = np.ones((7, 5))
    print ("Матрица, состоящая из одних единиц:n", c)
    
    Матрица, состоящая из одних единиц:
     [[1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]]
    
    d = np.full((2,2), 7)  # Создает матрицу (1, 2) заполненую заданным значением
    print(d)               # Prints "[[ 7.  7.]
                           #          [ 7.  7.]]"
    
    e = np.random.random((2,2))  # Создает еденичную матрицу (2, 2) заполненую случаными числами (0, 1)
    print(e)                     # Might print "[[ 0.91940167  0.08143941]
                                 #               [ 0.68744134  0.87236687]]"
    
    [[7 7]
     [7 7]]
    [[0.25744383 0.48056466]
     [0.13767881 0.40578168]]
    

    Обратите внимание: размерность массива задается не двумя аргументами
    функции, а одним — кортежем!

    Вот так — np.ones(7, 5) — создать массив не получится, так как
    функции в качестве параметра shape передается 7, а не кортеж
    (7, 5).

    И, наконец, третий способ — с помощью функции
    numpy.arange([start, ]stop, [step, ], …), которая создает
    одномерный массив последовательных чисел из промежутка
    [start, stop) с заданным шагом step, и метода
    array.reshape(shape).

    Параметр shape, как и в предыдущем примере, задает размерность
    матрицы (кортеж чисел). Логика работы метода ясна из следующего примера:

    v = np.arange(0, 24, 2)
    print ("Вектор-столбец:n", v)
    
    Вектор-столбец:
     [ 0  2  4  6  8 10 12 14 16 18 20 22]
    
    d = v.reshape((3, 4))
    print ("Матрица:n", d)
    
    Матрица:
     [[ 0  2  4  6]
     [ 8 10 12 14]
     [16 18 20 22]]
    

    Более подробно о том, как создавать массивы в NumPy, см.
    документацию.

    2. Индексирование

    Для получения элементов матрицы можно использовать несколько способов.
    Рассмотрим самые простые из них.

    Для удобства напомним, как выглядит матрица d:

    print ("Матрица:n", d)
    
    Матрица:
     [[ 0  2  4  6]
     [ 8 10 12 14]
     [16 18 20 22]]
    

    Элемент на пересечении строки i и столбца j можно
    получить с помощью выражения array[i, j].

    Обратите внимание: строки и столбцы нумеруются с нуля!

    print ("Второй элемент третьей строки матрицы:", d[2, 1])
    
    Второй элемент третьей строки матрицы: 18
    

    Из матрицы можно получать целые строки или столбцы с помощью выражений
    array[i, :] или array[:, j] соответственно:

    print ("Вторая строка матрицы d:n", d[1, :])
    print ("Четвертый столбец матрицы d:n", d[:, 3])
    
    Вторая строка матрицы d:
     [ 8 10 12 14]
    Четвертый столбец матрицы d:
     [ 6 14 22]
    

    Еще один способ получения элементов — с помощью выражения
    array[list1, list2], где list1, list2
    некоторые списки целых чисел. При такой адресации одновременно
    просматриваются оба списка и возвращаются элементы матрицы с
    соответствующими координатами. Следующий пример более понятно объясняет
    механизм работы такого индексирования:

    print ("Элементы матрицы d с координатами (1, 2) и (0, 3):n", d[[1, 0], [2, 3]])
    
    Элементы матрицы d с координатами (1, 2) и (0, 3):
     [12  6]
    
    # Slicing
    
    # Создадим матрицу (3, 4)
    # [[ 1  2  3  4]
    #  [ 5  6  7  8]
    #  [ 9 10 11 12]]
    a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
    
    # Используя слайсинг, созадим матрицу b из элементов матрицы а
    # будем использовать 0 и 1 строку, а так же 1 и 2 столебц
    # [[2 3]
    #  [6 7]]
    b = a[:2, 1:3]
    print(b)
    
    # ОБРАТИТЕ ВНИМАНИЕ НА ИЗМЕНЕНИЕ ИСХОДОЙ МАТРИЦЫ
    print(a[0, 1])   # Prints "2"
    b[0, 0] = 77     # b[0, 0] is the same piece of data as a[0, 1]
    print(a[0, 1])   # Prints "77"
    
    [[2 3]
     [6 7]]
    2
    77
    
    # Integer array indexing
    
    a = np.array([[1,2], [3, 4], [5, 6]])
    print(a)
    print()
    
    # Пример Integer array indexing
    # В результате получится массив размерности (3,)
    # Обратите внимание, что до запятой идут индексы строк, после - столбцов
    print(a[[0, 1, 2], [0, 1, 0]])  # Prints "[1 4 5]"
    print()
    
    # По-другому пример можно записать так
    print(np.array([a[0, 0], a[1, 1], a[2, 0]]))  # Prints "[1 4 5]"
    
    [[1 2]
     [3 4]
     [5 6]]
    
    [1 4 5]
    
    [1 4 5]
    

    Примеры использования слайсинга:

    # Создадим новый маассив, из которого будем выбирать эллементы
    a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
    
    print(a)  # prints "array([[ 1,  2,  3],
              #                [ 4,  5,  6],
              #                [ 7,  8,  9],
              #                [10, 11, 12]])"
    
    # Создадим массив индексов
    b = np.array([0, 2, 0, 1])
    
    # Выберем из каждой строки элемент с индексом из b (индекс столбца берется из b)
    print(a[np.arange(4), b])  # Prints "[ 1  6  7 11]"
    print()
    
    # Добавим к этим элементам 10
    a[np.arange(4), b] += 10
    
    print(a)  # prints "array([[11,  2,  3],
              #                [ 4,  5, 16],
              #                [17,  8,  9],
              #                [10, 21, 12]])
    
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    [ 1  6  7 11]
    
    [[11  2  3]
     [ 4  5 16]
     [17  8  9]
     [10 21 12]]
    
    a = np.array([[1,2], [3, 4], [5, 6]])
    
    bool_idx = (a > 2)   # Найдем эллементы матрицы a, которые больше 2
                         # В результате получим матрицу b, такой же размерности, как и a
    
    print(bool_idx)      # Prints "[[False False]
    print()              #          [ True  True]
                         #          [ True  True]]"
    
    # Воспользуемся полученным массивом для создания нового массива, ранга 1
    print(a[bool_idx])  # Prints "[3 4 5 6]"
    
    # Аналогично
    print(a[a > 2])     # Prints "[3 4 5 6]"
    
    [[False False]
     [ True  True]
     [ True  True]]
    
    [3 4 5 6]
    [3 4 5 6]
    
    #Помните, что вы можете пользоваться сразу несколькими типами индексирования
    a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
    
    row_r1 = a[1, :]
    row_r2 = a[1:2, :]
    print(row_r1, row_r1.shape)  # Prints "[5 6 7 8] (4,)"
    print(row_r2, row_r2.shape)  # Prints "[[5 6 7 8]] (1, 4)"
    
    [5 6 7 8] (4,)
    [[5 6 7 8]] (1, 4)
    

    Более подробно о различных способах индексирования в массивах см.
    документацию.

    3. Векторы, вектор-строки и вектор-столбцы

    Следующие два способа задания массива кажутся одинаковыми:

    a = np.array([1, 2, 3])
    b = np.array([[1], [2], [3]])
    

    Однако, на самом деле, это задание одномерного массива (то есть
    вектора) и двумерного массива:

    print ("Вектор:n", a)
    print ("Его размерность:n", a.shape)
    print ("Двумерный массив:n", b)
    print ("Его размерность:n", b.shape)
    
    Вектор:
     [1 2 3]
    Его размерность:
     (3,)
    Двумерный массив:
     [[1]
     [2]
     [3]]
    Его размерность:
     (3, 1)
    

    Обратите внимание: вектор (одномерный массив) и вектор-столбец
    или вектор-строка (двумерные массивы) являются различными объектами в
    NumPy, хотя математически задают один и тот же объект. В случае
    одномерного массива кортеж shape состоит из одного числа и имеет
    вид (n,), где n — длина вектора. В случае двумерных
    векторов в shape присутствует еще одна размерность, равная
    единице.

    В большинстве случаев неважно, какое представление использовать, потому
    что часто срабатывает приведение типов. Но некоторые операции не
    работают для одномерных массивов. Например, транспонирование (о нем
    пойдет речь ниже):

    a = a.T
    b = b.T
    
    print ("Вектор не изменился:n", a)
    print ("Его размерность также не изменилась:n", a.shape)
    print ("Транспонированный двумерный массив:n", b)
    print ("Его размерность изменилась:n", b.shape)
    
    Вектор не изменился:
     [1 2 3]
    Его размерность также не изменилась:
     (3,)
    Транспонированный двумерный массив:
     [[1 2 3]]
    Его размерность изменилась:
     (1, 3)
    

    4. Datatypes

    Все элементы в массиве numpy принадлежат одному типу. В этом плане
    массивы ближе к C, чем к привычным вам листам питона. Numpy имеет
    множество встренных типов, подходящих для решения большинства задач.

    x = np.array([1, 2])   # Автоматический выбор типа
    print(x.dtype)         # Prints "int64"
    
    x = np.array([1.0, 2.0])   # Автоматический выбор типа
    print(x.dtype)             # Prints "float64"
    
    x = np.array([1, 2], dtype=np.int64)   # Принудительное выставление типа
    print(x.dtype)                         # Prints "int64"
    
    int32
    float64
    int64
    

    5. Математические операции

    К массивам (матрицам) можно применять известные вам математические
    операции. Следут понимать, что при этом у элементов должны быть схожие
    размерности. Поведение в случае не совпадения размерностей хорошо
    описанно в документации numpy.

    x = np.array([[1,2],[3,4]], dtype=np.float64)
    y = np.array([[5,6],[7,8]], dtype=np.float64)
    arr = np.array([1, 2])
    
    # Сложение происходит поэлеметно
    
    # [[ 6.0  8.0]
    #  [10.0 12.0]]
    print(x + y)
    print()
    print(np.add(x, y))
    print('С числом')
    print(x + 1)
    print('C массивом другой размерности')
    print(x + arr)
    
    [[ 6.  8.]
     [10. 12.]]
    
    [[ 6.  8.]
     [10. 12.]]
    С числом
    [[2. 3.]
     [4. 5.]]
    C массивом другой размерности
    [[2. 4.]
     [4. 6.]]
    
    # Вычитание
    print(x - y)
    print(np.subtract(x, y))
    
    [[-4. -4.]
     [-4. -4.]]
    [[-4. -4.]
     [-4. -4.]]
    
    # Деление
    # [[ 0.2         0.33333333]
    #  [ 0.42857143  0.5       ]]
    print(x / y)
    print(np.divide(x, y))
    
    [[0.2        0.33333333]
     [0.42857143 0.5       ]]
    [[0.2        0.33333333]
     [0.42857143 0.5       ]]
    
    # Другие функции
    # [[ 1.          1.41421356]
    #  [ 1.73205081  2.        ]]
    print(np.sqrt(x))
    
    [[1.         1.41421356]
     [1.73205081 2.        ]]
    

    6. Умножение матриц и столбцов

    Напоминание теории. Операция умножения определена для двух
    матриц, таких что число столбцов первой равно числу строк второй.

    Пусть матрицы A и B таковы, что
    A ∈ ℝn×k и
    B ∈ ℝk×m. Произведением матриц
    A и B называется матрица C, такая что
    cij = kr = 1airbrj, где cij
    элемент матрицы C, стоящий на пересечении строки с номером
    i и столбца с номером j.

    В NumPy произведение матриц вычисляется с помощью функции
    numpy.dot(a, b, …) или с помощью метода
    array1.dot(array2), где array1 и array2
    перемножаемые матрицы.

    a = np.array([[1, 0], [0, 1]])
    b = np.array([[4, 1], [2, 2]])
    r1 = np.dot(a, b)
    r2 = a.dot(b)
    
    print ("Матрица A:n", a)
    print ("Матрица B:n", b)
    print ("Результат умножения функцией:n", r1)
    print ("Результат умножения методом:n", r2)
    
    Матрица A:
     [[1 0]
     [0 1]]
    Матрица B:
     [[4 1]
     [2 2]]
    Результат умножения функцией:
     [[4 1]
     [2 2]]
    Результат умножения методом:
     [[4 1]
     [2 2]]
    

    Матрицы в NumPy можно умножать и на векторы:

    c = np.array([1, 2])
    r3 = b.dot(c)
    
    print ("Матрица:n", b)
    print ("Вектор:n", c)
    print ("Результат умножения:n", r3)
    
    Матрица:
     [[4 1]
     [2 2]]
    Вектор:
     [1 2]
    Результат умножения:
     [6 6]
    

    Обратите внимание: операция * производит над матрицами
    покоординатное умножение, а не матричное!

    r = a * b
    
    print ("Матрица A:n", a)
    print ("Матрица B:n", b)
    print ("Результат покоординатного умножения через операцию умножения:n", r)
    
    Матрица A:
     [[1 0]
     [0 1]]
    Матрица B:
     [[4 1]
     [2 2]]
    Результат покоординатного умножения через операцию умножения:
     [[4 0]
     [0 2]]
    

    Более подробно о матричном умножении в NumPy см.
    документацию.

    7. Объединение массивов

    Массивы можно Объединенять. Есть горизонтальное и вертикальное
    объединение.

    a = np.floor(10*np.random.random((2,2)))
    b = np.floor(10*np.random.random((2,2)))
    
    print(a)
    print(b)
    print()
    
    
    print(np.vstack((a,b)))
    print()
    
    print(np.hstack((a,b)))
    
    [[4. 0.]
     [1. 4.]]
    [[9. 7.]
     [2. 6.]]
    
    [[4. 0.]
     [1. 4.]
     [9. 7.]
     [2. 6.]]
    
    [[4. 0. 9. 7.]
     [1. 4. 2. 6.]]
    

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

    a = np.array(range(10), float)
    print(a)
    print()
    
    # Превратим в матрицу
    a = a.reshape((5, 2))
    print(a)
    print()
    
    # Вернем обратно
    print(a.flatten())
    
    # Другой вариант
    print(a.reshape((-1)))
    # Превратим в марицу (9, 1)
    print(a.reshape((-1, 1)))
    # Превратим в марицу (1, 9)
    print(a.reshape((1, -1)))
    
    [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
    
    [[0. 1.]
     [2. 3.]
     [4. 5.]
     [6. 7.]
     [8. 9.]]
    
    [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
    [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
    [[0.]
     [1.]
     [2.]
     [3.]
     [4.]
     [5.]
     [6.]
     [7.]
     [8.]
     [9.]]
    [[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]]
    

    Задания: (Блок 1)

    Задание 1:

    Решите без использования циклов средставми NumPy (каждый пункт решается
    в 1-2 строчки)

    1. Создайте вектор с элементами от 12 до 42
    2. Создайте вектор из нулей длины 12, но его пятый елемент должен быть равен 1
    3. Создайте матрицу (3, 3), заполненую от 0 до 8
    4. Найдите все положительные числа в np.array([1,2,0,0,4,0])
    5. Умножьте матрицу размерности (5, 3) на (3, 2)
    6. Создайте матрицу (10, 10) так, чтобы на границе были 0, а внтури 1
    7. Создайте рандомный вектор и отсортируйте его
    8. Каков эквивалент функции enumerate для numpy массивов?
    9. *Создайте рандомный вектор и выполните нормализацию столбцов (из каждого столбца вычесть среднее этого столбца, из каждого столбца вычесть sd этого столбца)
    10. *Для заданного числа найдите ближайший к нему элемент в векторе
    11. *Найдите N наибольших значений в векторе
    # ваш код здесь
    

    Задание 2:

    Напишите полностью векторизованный вариант

    Дан трёхмерный массив, содержащий изображение, размера (height, width,
    numChannels), а также вектор длины numChannels. Сложить каналы
    изображения с указанными весами, и вернуть результат в виде матрицы
    размера (height, width). Считать реальное изображение можно при помощи
    функции

    scipy.misc.imread

    (если изображение не в формате png,
    установите пакет pillow:

    conda install pillow

    ). Преобразуйте
    цветное изображение в оттенки серого, использовав коэффициенты
    np.array([0.299, 0.587, 0.114]).

    # ваш код здесь
    

    8. Транспонирование матриц

    Напоминание теории. Транспонированной матрицей AT
    называется матрица, полученная из исходной матрицы A заменой
    строк на столбцы. Формально: элементы матрицы AT определяются
    как aTij = aji, где aTij — элемент
    матрицы AT, стоящий на пересечении строки с номером i
    и столбца с номером j.

    В NumPy транспонированная матрица вычисляется с помощью функции
    numpy.transpose() или с помощью метода array.T, где
    array — нужный двумерный массив.

    a = np.array([[1, 2], [3, 4]])
    b = np.transpose(a)
    c = a.T
    
    print ("Матрица:n", a)
    print ("Транспонирование функцией:n", b)
    print ("Транспонирование методом:n",  c)
    
    Матрица:
     [[1 2]
     [3 4]]
    Транспонирование функцией:
     [[1 3]
     [2 4]]
    Транспонирование методом:
     [[1 3]
     [2 4]]
    

    См. более подробно о
    numpy.transpose()
    и
    array.T
    в NumPy.

    В следующих разделах активно используется модуль numpy.linalg,
    реализующий некоторые приложения линейной алгебры. Более подробно о
    функциях, описанных ниже, и различных других функциях этого модуля можно
    посмотреть в его
    документации.

    9. Определитель матрицы

    Напоминание теории. Для квадратных матриц существует понятие
    определителя.

    Пусть A — квадратная матрица. Определителем (или
    детерминантом) матрицы A ∈ ℝn×n назовем
    число

    detA = α1, α2, …, αn( − 1)N(α1, α2, …, αn)aα11⋅⋅⋅aαnn, 

    где α1, α2, …, αn — перестановка
    чисел от 1 до n,
    N(α1, α2, …, αn) — число инверсий в
    перестановке, суммирование ведется по всем возможным перестановкам длины
    n.

    Не стоит расстраиваться, если это определение понятно не до конца — в
    дальнейшем в таком виде оно не понадобится.

    Например, для матрицы размера 2×2 получается:

    det

    a11


    a12











    a21


    a22


     = a11a22 − a12a21

    Вычисление определителя матрицы по определению требует порядка
    n! операций, поэтому разработаны методы, которые позволяют
    вычислять его быстро и эффективно.

    В NumPy определитель матрицы вычисляется с помощью функции
    numpy.linalg.det(a), где a — исходная матрица.

    a = np.array([[1, 2, 1], [1, 1, 4], [2, 3, 6]], dtype=np.float32)
    det = np.linalg.det(a)
    
    print ("Матрица:n", a)
    print ("Определитель:n", det)
    
    Матрица:
     [[1. 2. 1.]
     [1. 1. 4.]
     [2. 3. 6.]]
    Определитель:
     -1.0
    

    Рассмотрим одно интересное свойство определителя. Пусть у нас есть
    параллелограмм с углами в точках
    (0, 0), (c, d), (a + c, b + d), (a, b) (углы даны в порядке обхода по
    часовой стрелке). Тогда площадь этого параллелограмма можно вычислить
    как модуль определителя матрицы


    a


    c











    b


    d


    .
    Похожим образом можно выразить и объем параллелепипеда через
    определитель матрицы размера 3×3.

    10. Ранг матрицы

    Напоминание теории. Рангом матрицы A называется
    максимальное число линейно независимых строк (столбцов) этой матрицы.

    В NumPy ранг матрицы вычисляется с помощью функции
    numpy.linalg.matrix_rank(M, tol=None), где M — матрица,
    tol — параметр, отвечающий за некоторую точность вычисления. В
    простом случае можно его не задавать, и функция сама определит
    подходящее значение этого параметра.

    a = np.array([[1, 2, 3], [1, 1, 1], [2, 2, 2]])
    r = np.linalg.matrix_rank(a)
    
    print ("Матрица:n", a)
    print ("Ранг матрицы:", r)
    
    Матрица:
     [[1 2 3]
     [1 1 1]
     [2 2 2]]
    Ранг матрицы: 2
    

    С помощью вычисления ранга матрицы можно проверять линейную
    независимость системы векторов.

    Допустим, у нас есть несколько векторов. Составим из них матрицу, где
    наши векторы будут являться строками. Понятно, что векторы линейно
    независимы тогда и только тогда, когда ранг полученной матрицы совпадает
    с числом векторов. Приведем пример:

    a = np.array([1, 2, 3])
    b = np.array([1, 1, 1])
    c = np.array([2, 3, 5])
    m = np.array([a, b, c])
    
    print (np.linalg.matrix_rank(m) == m.shape[0])
    
    True
    

    11. Системы линейных уравнений

    Напоминание теории. Системой линейных алгебраических уравнений
    называется система вида Ax = b, где
    A ∈ ℝn×m, x ∈ ℝm×1, b ∈ ℝn×1.
    В случае квадратной невырожденной матрицы A решение системы
    единственно.

    В NumPy решение такой системы можно найти с помощью функции
    numpy.linalg.solve(a, b), где первый аргумент — матрица
    A, второй — столбец b.

    a = np.array([[3, 1], [1, 2]])
    b = np.array([9, 8])
    x = np.linalg.solve(a, b)
    
    print ("Матрица A:n", a)
    print ("Вектор b:n", b)
    print ("Решение системы:n", x)
    
    Матрица A:
     [[3 1]
     [1 2]]
    Вектор b:
     [9 8]
    Решение системы:
     [2. 3.]
    

    Убедимся, что вектор x действительно является решением системы:

    print (a.dot(x))
    
    [9. 8.]
    

    Бывают случаи, когда решение системы не существует. Но хотелось бы все
    равно “решить” такую систему. Логичным кажется искать такой вектор
    x, который минимизирует выражение
    Ax − b2 — так мы приблизим выражение
    Ax к b.

    В NumPy такое псевдорешение можно искать с помощью функции
    numpy.linalg.lstsq(a, b, …), где первые два аргумента такие
    же, как и для функции numpy.linalg.solve(). Помимо решения
    функция возвращает еще три значения, которые нам сейчас не понадобятся.

    a = np.array([[0, 1], [1, 1], [2, 1], [3, 1]])
    b = np.array([-1, 0.2, 0.9, 2.1])
    x, res, r, s = np.linalg.lstsq(a, b, rcond=None)
    
    print ("Матрица A:n", a)
    print ("Вектор b:n", b)
    print ("Псевдорешение системы:n", x)
    
    Матрица A:
     [[0 1]
     [1 1]
     [2 1]
     [3 1]]
    Вектор b:
     [-1.   0.2  0.9  2.1]
    Псевдорешение системы:
     [ 1.   -0.95]
    

    12. Обращение матриц

    Напоминание теории. Для квадратных невырожденных матриц определено
    понятие обратной матрицы.

    Пусть A — квадратная невырожденная матрица. Матрица
    A − 1 называется обратной матрицей к A, если

    AA − 1 = A − 1A = I, 

    где I — единичная матрица.

    В NumPy обратные матрицы вычисляются с помощью функции
    numpy.linalg.inv(a), где a — исходная матрица.

    a = np.array([[1, 2, 1], [1, 1, 4], [2, 3, 6]], dtype=np.float32)
    b = np.linalg.inv(a)
    
    print ("Матрица A:n", a)
    print ("Обратная матрица к A:n", b)
    print ("Произведение A на обратную должна быть единичной:n", a.dot(b))
    
    Матрица A:
     [[1. 2. 1.]
     [1. 1. 4.]
     [2. 3. 6.]]
    Обратная матрица к A:
     [[ 6.  9. -7.]
     [-2. -4.  3.]
     [-1. -1.  1.]]
    Произведение A на обратную должна быть единичной:
     [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    

    13. Собственные числа и собственные вектора матрицы

    Напоминание теории. Для квадратных матриц определены понятия
    собственного вектора и собственного числа.

    Пусть A — квадратная матрица и
    A ∈ ℝn×n. Собственным вектором матрицы
    A называется такой ненулевой вектор
    x ∈ ℝn, что для некоторого
    λ ∈ ℝ выполняется равенство
    Ax = λx. При этом λ называется
    собственным числом матрицы A. Собственные числа и
    собственные векторы матрицы играют важную роль в теории линейной алгебры
    и ее практических приложениях.

    В NumPy собственные числа и собственные векторы матрицы вычисляются
    с помощью функции numpy.linalg.eig(a), где a — исходная
    матрица. В качестве результата эта функция выдает одномерный массив
    w собственных чисел и двумерный массив v, в котором по
    столбцам записаны собственные вектора, так что вектор v[:, i]
    соотвествует собственному числу w[i].

    a = np.array([[-1, -6], [2, 6]])
    w, v = np.linalg.eig(a)
    
    print ("Матрица A:n", a)
    print ("Собственные числа:n", w)
    print ("Собственные векторы:n", v)
    
    Матрица A:
     [[-1 -6]
     [ 2  6]]
    Собственные числа:
     [2. 3.]
    Собственные векторы:
     [[-0.89442719  0.83205029]
     [ 0.4472136  -0.5547002 ]]
    

    Обратите внимание: у вещественной матрицы собственные значения или
    собственные векторы могут быть комплексными.

    14. Расстояния между векторами

    Вспомним некоторые нормы, которые можно ввести в пространстве
    n, и рассмотрим, с помощью каких библиотек и
    функций их можно вычислять в NumPy.

    p-норма

    p-норма (норма Гёльдера) для вектора
    x = (x1, …, xn) ∈ ℝn вычисляется по
    формуле:

    xp = (ni = 1|xi|p)1 ⁄ p,  p ≥ 1.

    В частных случаях при: * p = 1 получаем 1 норму
    * p = 2 получаем 2 норму

    Далее нам понабится модуль numpy.linalg, реализующий некоторые
    приложения линейной алгебры. Для вычисления различных норм мы используем
    функцию numpy.linalg.norm(x, ord=None, …), где x
    исходный вектор, ord — параметр, определяющий норму (мы
    рассмотрим два варианта его значений — 1 и 2). Импортируем эту функцию:

    from numpy.linalg import norm
    

    1 норма

    1 норма (также известная как манхэттенское
    расстояние)
    для вектора x = (x1, …, xn) ∈ ℝn
    вычисляется по формуле:

    x1 = ni = 1|xi|.

    Ей в функции numpy.linalg.norm(x, ord=None, …) соответствует
    параметр ord=1.

    a = np.array([1, 2, -3])
    print('Вектор a:', a)
    
    Вектор a: [ 1  2 -3]
    
    print('L1 норма вектора a:n', norm(a, ord=1))
    
    L1 норма вектора a:
     6.0
    

    2 норма

    2 норма (также известная как евклидова норма) для вектора
    x = (x1, …, xn) ∈ ℝn вычисляется по
    формуле:

    x2 = (ni = 1(xi)2).

    Ей в функции numpy.linalg.norm(x, ord=None, …) соответствует
    параметр ord=2.

    print ('L2 норма вектора a:n', norm(a, ord=2))
    
    L2 норма вектора a:
     3.7416573867739413
    

    Более подробно о том, какие еще нормы (в том числе матричные) можно
    вычислить, см.
    документацию.

    15. Расстояния между векторами

    Для двух векторов x = (x1, …, xn) ∈ ℝn и
    y = (y1, …, yn) ∈ ℝn 1 и
    2 раccтояния вычисляются по следующим формулам
    соответственно:

    ρ1(x, y) = x − y1 = ni = 1|xi − yi|

    ρ2(x, y) = x − y2 = (ni = 1(xi − yi)2).

    a = np.array([1, 2, -3])
    b = np.array([-4, 3, 8])
    print ('Вектор a:', a)
    print ('Вектор b:', b)
    
    Вектор a: [ 1  2 -3]
    Вектор b: [-4  3  8]
    
    print ('L1 расстояние между векторами a и b:n', norm(a - b, ord=1))
    print ('L2 расстояние между векторами a и b:n', norm(a - b, ord=2))
    
    L1 расстояние между векторами a и b:
     17.0
    L2 расстояние между векторами a и b:
     12.12435565298214
    

    16. Скалярное произведение и угол между векторами

    a = np.array([0, 5, -1])
    b = np.array([-4, 9, 3])
    print ('Вектор a:', a)
    print ('Вектор b:', b)
    
    Вектор a: [ 0  5 -1]
    Вектор b: [-4  9  3]
    

    Скалярное произведение в пространстве n для двух
    векторов x = (x1, …, xn) и
    y = (y1, …, yn) определяется как:

    x, y⟩ = ni = 1xiyi.

    Длиной вектора x = (x1, …, xn) ∈ ℝn
    называется квадратный корень из скалярного произведения, то есть длина
    равна евклидовой норме вектора:

    |x| = (x, x) = (ni = 1x2i) = x2.

    Теперь, когда мы знаем расстояние между двумя ненулевыми векторами и их
    длины, мы можем вычислить угол между ними через скалярное произведение:

    x, y⟩ = |x||y|cos(α) ⟹ cos(α) = (x, y)/(|x||y|), 

    где α ∈ [0, π] — угол между векторами x и
    y.

    cos_angle = np.dot(a, b) / norm(a) / norm(b)
    print ('Косинус угла между a и b:', cos_angle)
    print ('Сам угол:', np.arccos(cos_angle))
    
    Косинус угла между a и b: 0.8000362836474323
    Сам угол: 0.6434406336093618
    

    17. Комплексные числа в питоне

    Напоминание теории. Комплексными числами называются числа вида
    x + iy, где x и y — вещественные числа, а
    i — мнимая единица (величина, для которой выполняется равенство
    i2 =  − 1). Множество всех комплексных чисел обозначается
    буквой (подробнее про комплексные числа см.
    википедию).

    В питоне комплескные числа можно задать следующим образом (j
    обозначает мнимую единицу):

    a = 3 + 2j
    b = 1j
    
    print ("Комплексное число a:n", a)
    print ("Комплексное число b:n", b)
    
    Комплексное число a:
     (3+2j)
    Комплексное число b:
     1j
    

    С комплексными числами в питоне можно производить базовые арифметические
    операции так же, как и с вещественными числами:

    c = a * a
    d = a / (4 - 5j)
    
    print ("Комплексное число c:n", c)
    print ("Комплексное число d:n", d)
    
    Комплексное число c:
     (5+12j)
    Комплексное число d:
     (0.0487804878048781+0.5609756097560976j)
    

    Задания: (Блок 2)

    Задание 3:

    Рассмотрим сложную математическую функцию на отрезке [1, 15]:

    f(x) = sin(x / 5) * exp(x / 10) + 5 * exp(-x / 2)

    images/lab14/func.png

    Она может описывать, например, зависимость оценок, которые выставляют
    определенному сорту вина эксперты, в зависимости от возраста этого вина.
    Мы хотим приблизить сложную зависимость с помощью функции из
    определенного семейства. В этом задании мы будем приближать указанную
    функцию с помощью многочленов.

    Как известно, многочлен степени n (то есть w0 +
    w1x + w2x2 + + wnxn)
    однозначно определяется любыми n + 1 различными точками, через которые
    он проходит. Это значит, что его коэффициенты w0, … wn
    можно определить из следующей системы линейных уравнений:

    images/lab14/eqs.png

    где через x1, …, xn, xn + 1 обозначены точки, через которые
    проходит многочлен, а через f(x1), …, f(xn), f(xn + 1)
    значения, которые он должен принимать в этих точках.

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

    1. Сформируйте систему линейных уравнений (то есть задайте матрицу
      коэффициентов A и свободный вектор b) для многочлена первой степени,
      который должен совпадать с функцией f в точках 1 и 15. Решите данную
      систему с помощью функции scipy.linalg.solve. Нарисуйте функцию f и
      полученный многочлен. Хорошо ли он приближает исходную функцию?
    2. Повторите те же шаги для многочлена второй степени, который совпадает
      с функцией f в точках 1, 8 и 15. Улучшилось ли качество
      аппроксимации?
    3. Повторите те же шаги для многочлена третьей степени, который
      совпадает с функцией f в точках 1, 4, 10 и 15. Хорошо ли он
      аппроксимирует функцию? Коэффициенты данного многочлена (четыре числа
      в следующем порядке: w_0, w_1, w_2, w_3) являются ответом на задачу.
      Округлять коэффициенты не обязательно, но при желании можете
      произвести округление до второго знака (т.е. до числа вида 0.42)

    Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в Pascal. Матрица – это математический объект, представляющий собой прямоугольную таблицу. Таблица состоит из элементов, которые находятся на пересечении строк и столбцов, определяющих их, то есть i-ая строка и j-ый столбец задают адрес k-ому элементу матрицы (kij). Двумерные массивы абсолютно аналогичны математическим матрицам.

    В отличие от одномерных массивов, двумерные характеризуются в программе парой индексов, один из которых соответствует номеру строки, другой – столбца:

    Mas[m, n], где Mas – имя массива, n – номер строки, а m – номер столбца.

    Описать матрицу в программе можно несколькими способами:

    1) В разделе описания переменных:

    Var Mas: Array[1..n, 1..m] of <тип элементов>;

    2) При помощи одномерного массива, элементами которого являются одномерные массивы.
    Пример:

    Const
    n = 5; m = 10;
    Type
    Arr1 = Array[1..m] of <тип элементов >;
    Arr2 = Array[1..n] of arr1;
    Var Mas: arr2;

    Переменная Mas – матрица, состоящая из пяти строк, в каждую из которых включено по десять элементов.

    3) Предыдущий способ можно упростить так:

    Const n = 5; m = 10;
    Турe arr=Array[1..n] Of Аrrау[1..m] of <тип элементов>;
    Var Mas: arr;

    4) И снова сократив запись, получим:

    Const n = 5; m = 10;
    Type arr = Array[1..n,1..m] of <тип элементов>;
    Var Mas: arr;

    Для обработки содержимого матрицы, удобно пользоваться вложенными циклами:

    For i:= 1 To n Do
      For j:= 1 To m Do

    Например, для заполнения массива случайнми числами:

    for i:=1 to n do
      for j:=1 to n do 
        x[i,j]:=random(100); 

    Для вывода двумерного массива вещественных чисел размером n строк, m столбцов:

    for i:=1 to n do begin
      for j:=1 to m do 
        write(x[i,j]:5:2);
      writeln;
    end;

    В следующей программе массив сначала заполняется числами с клавиатуры, а затем выводиться на экран.

    program input_and_output_array;
    uses crt;
    const n=3; m=3;
    var i, j: integer;
    mas: array[1..n, 1..m] of integer;
    begin
      {ввод массива}
      for i:=1 to n do
        for j:=1 to m do
        begin
          write(' Элемент ', i,' строки, ',j,' столбца = ');
          readln(mas[i, j]);
        end;
      writeln(' Получившаяся матрица: ');
      {вывод массива}
      for i:=1 to n do
      begin
        for j:=1 to m do
        begin
          write(mas[i, j]:5);
        end;
      writeln
      end;
    end.

    Количество элементов в массиве (его размерность) можно узнать, умножив количество строк на количество столбцов.

    Сумма всех элементов квадратной матрицы:

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum); 

    Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):

    sum:=0;
    
    for i:=1 to n do 
      sum:=sum+x[i,i];
    
    writeln('Сумма=',sum);

    Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1 или j=n+1-i:

    sum:=0;
    
    for i:=1 to n do 
      sum:=sum+x[i,n+1-i];
    
    writeln('Сумма=',sum);

    Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        if i>j then 
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Можно не просматривать весь массив, а брать только нужные элементы:

    sum:=0;
    
    for i:=2 to n do
      for j:=1 to i-1 do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Сумма элементов выше и на главной диагонали квадратной матрицы:

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do
        if i<=j then 
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Здесь также можно не просматривать весь массив, а брать только нужные элементы:

    sum:=0;
    
    for i:=1 to n do
      for j:=i to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже) :

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do
        if i+j>n+1 then 
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Можно не просматривать весь массив, а брать только нужные элементы:

    sum:=0;
    
    for i:=2 to n do
      for j:=n+2-i to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

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

    sum:=0;
    
    for i:=1 to n do
      for j:=n+1-i to n do 
        sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали возможно применине такого кода:

    sum:=0;
    
    for i:=1 to n do
      for j:=1 to n do
        if (i<=j) and (i+j<=n+1) then
          sum:=sum+x[i,j];
    
    writeln('Сумма=',sum);

    Подсчет сумм элементов по строкам:

    for i:=1 to n do begin
      sum:=0;
    
      for j:=1 to n do 
        sum:=sum+x[i,j];
    
      writeln('Сумма ',i,'-й строки',sum);
    end;

    Подсчет сумм элементов по столбцам:

    for j:=1 to n do begin
      sum:=0;
    
      for i:=1 to n do 
        sum:=sum+x[i,j];
    
      writeln('Сумма ',j,'-го столбца ',sum);
    end;

    Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:

    for i:=1 to n do 
      sum[j]:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        zum[j]:=sum[j]+x[i,j];
    
    {вывод сумм по столбцам}
    for i:=1 to n do 
      write(sum[i]:4);
    writeln; 

    Суммы элементов по диагоналям, параллельным главной диагонали.

    Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив:

    Var sum:array[-n+1..n-1] of integer;

    Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:

    for i:=-n+1 to n-1 do 
      sum[i]:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        sum[i-j]:=sum[i-j]+x[i,j];
    
    for i:=-n+1 to n-1 do 
      write(sum[i]); 

    Суммы элементов по диагоналям, параллельным побочной диагонали.

    for i:=2 to 2*n do 
      sum[i]:=0;
    
    for i:=1 to n do
      for j:=1 to n do 
        sum[i+j]:=sum[i+j]+x[i,j];
    
    for i:=2 to 2*n do 
      write(sum[i]);

    Суммы элементов по периметрам двумерного массива.

    Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2 при четном n и k=n div 2 +1 при нечетном значении n.

    Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1, т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.

    Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1.

    Затем считаем элементы по двум паралельным столбцам i и n-i+1 (не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1].

    k:=n div 2;
    
    for i:=1 to k do begin
      sum:=0;
    
      {строки}
      for j:=i to n-i+1 do
        sum:=sum+x[i,j]+x[n-i+1,j];
    
      {столбцы}
      for j:=i+1 to n-i do
        sum:=sum+x[j,i]+x[j,n-i+1];
    
      writeln(sum); {вывод суммы}
    end;
    
    if n mod 2=1 then
      writeln(x[k+1,k+1]); 

    Двумерные массивы – матрицы

    Двумерный
    массив в Паскале трактуется как
    одномерный массив, тип элементов
    которого также является массивом
    (массив массивов). Положение элементов
    в двумерных массивах описывается двумя
    индексами. Их можно представить в виде
    прямоугольной таблицы или матрицы.

    Рассмотрим матрицу
    размерностью 3*3, то есть в ней будет три
    строки, а в каждой строке по три элемента:

    Каждый
    элемент имеет свой номер, как у одномерных
    массивов, но сейчас номер уже состоит
    из двух чисел – номера строки, в которой
    находится элемент, и номера столбца.
    Таким образом, номер элемента определяется
    пересечением строки и столбца. Например,
    a21
    – это элемент, стоящий во второй строке
    и в первом столбце.

    Описание
    двумерного массива.

    Существует несколько способов объявления
    двумерного массива.

    Мы уже умеем
    описывать одномерные массивы, элементы
    которых могут иметь любой тип, а,
    следовательно, и сами элементы могут
    быть массивами. Рассмотрим следующее
    описание типов и переменных:

    Type

    Vector=
    array
    [1..5] of
    <тип_элементов>;

    Matrix=
    array [1..10] of vector;

    Var
    m: matrix;

    Мы
    объявили матрицу m,
    состоящую из 10 строк, в каждой из которых
    5 столбцов. При этом к каждой i-й
    строке можно обращаться m[i],
    а каждому j-му
    элементу внутри i-й
    строки – m[i,j].

    Определение типов
    для двумерных массивов можно задавать
    и в одной строке:

    Type

    Matrix=
    array [1..5] of array [1..10] of <тип
    элементов>;

    или
    еще проще:

    type

    matrix=
    array
    [1..5, 1..10] of
    <тип элементов>;

    Обращение
    к элементам двумерного массива имеет
    вид: M[i,
    j].
    Это означает, что мы хотим получить
    элемент, расположенный в i-й
    строке и
    j-м
    столбце. Тут главное не перепутать
    строки со столбцами, а то мы можем снова
    получить обращение к несуществующему
    элементу. Например, обращение к элементу
    M[10,
    5] имеет правильную форму записи, но
    может вызвать ошибку в работе программы.

    Основные действия с матрицами

    Все,
    что было сказано об основных действиях
    с одномерными массивами, справедливо
    и для матриц. Единственное действие,
    которое можно осуществить над однотипными
    матрицами целиком – это присваивание.
    Т.е., если в программе у нас описаны две
    матрицы одного типа, например,

    type

    matrix= array [1..5, 1..10] of integer;

    var

    a,
    b:
    matrix;

    то
    в ходе выполнения программы можно
    присвоить матрице a
    значение матрицы b
    (a:=b).
    Все остальные
    действия выполняются поэлементно, при
    этом над элементами можно выполнять
    все допустимые операции, которые
    определены для типа данных элементов
    массива.

    Это означает, что если массив состоит
    из целых чисел, то над его элементами
    можно выполнять операции, определенные
    для целых чисел, если же массив состоит
    из символов, то к ним применимы операции,
    определенные для работы с символами.

    Ввод
    матрицы.

    Для последовательного ввода элементов
    одномерного массива мы использовали
    цикл for,
    в котором изменяли значение индекса с
    1-го до последнего. Но положение элемента
    в двумерном массиве определяется двумя
    индексами: номером строки и номером
    столбца. Это значит, что нам нужно будет
    последовательно изменять номер строки
    с 1-й до последней и в каждой строке
    перебирать элементы столбцов с 1-го до
    последнего. Значит, нам потребуется
    два цикла for,
    причем один из них будет вложен в другой.

    Рассмотрим пример
    ввода матрицы с клавиатуры:

    type

    matrix= array [1..5, 1..10] of integer;

    var

    a,
    : matrix;

    i,
    j: integer; {индексы
    массива}

    begin

    for
    i:=1
    to
    5 do
    {цикл для перебора всех строк}

    for
    j:=1
    to
    10 do
    {перебор всех элементов строки по
    столбцам}

    readln(a[i,j]);
    {ввод с клавиатуры элемента, стоящего
    в i-й
    строке
    и j-м
    столбце}

    Матрицу
    можно заполнить случайным образом,
    т.е. использовать функцию random(N),
    а также присвоить каждому элементу
    матрицы значение некоторого выражения.
    Способ заполнения матрицы выбирается
    в зависимости от поставленной задачи,
    но в любом случае должен быть определен
    каждый элемент в каждой строке и каждом
    столбце.

    Вывод
    матрицы на экран.

    Вывод элементов матрицы также
    осуществляется последовательно,
    необходимо напечатать элементы каждой
    строки и каждого столбца. При этом
    хотелось бы, чтобы элементы, стоящие в
    одной строке, печатались рядом, т.е. в
    строку, а элементы столбца располагались
    один под другим. Для этого необходимо
    выполнить следующую последовательность
    действий (рассмотрим фрагмент программы
    для массива, описанного в предыдущем
    примере):

    for
    i:=1
    to
    5 do
    {цикл для перебора всех строк}

    begin

    for
    j:=1
    to
    10 do
    {перебор всех элементов строки по
    столбцам}

    write
    (a[i,j]:4);
    {печать элементов, стоящих в i-й
    строке матрицы в

    одной экранной строке, при этом для
    вывода
    каждого
    элемента отводится 4 позиции}

    writeln;
    {прежде, чем сменить номер строки
    в матрице, нужно

    перевести курсор на начало новой
    экранной строки}

    end;

    Замечание
    (
    это
    важно!
    ):
    очень часто в программах студентов
    встречается ошибка, когда ввод с
    клавиатуры или вывод на экран массива
    пытаются осуществить следующим образом:
    readln(a),
    writeln(a),
    где а
    – это переменная типа массив. При этом
    их удивляет сообщение компилятора, что
    переменную этого типа невозможно
    считать или напечатать. Может быть, вы
    поймете, почему этого сделать нельзя,
    если представите N
    кружек, стоящих в ряд, а у вас в руках,
    например, чайник с водой. Можете вы по
    команде «налей воду» наполнить сразу
    все кружки? Как бы вы ни старались, но
    в каждую кружку придется наливать
    отдельно. Заполнение и вывод на экран
    элементов массива также должно
    осуществляться последовательно и
    поэлементно, т.к. в памяти ЭВМ элементы
    массива располагаются в последовательных
    ячейках.

    Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

    • #
    • #
    • #
    • #
    • #
    • #
    • #
    • #
    • #
    • #
    • #

    Матрица – это двухмерная структура данных, в которой числа расположены в виде строк и столбцов. Например:

    Эта матрица является матрицей три на четыре, потому что она состоит из 3 строк и 4 столбцов.

    • Матрицы в Python
    • NumPy массивы в Python
    • Как создать массив NumPy?
      • Массив целых чисел, чисел с плавающей точкой и составных чисел
      • Массив нулей и единиц
      • Использование arange() и shape()
    • Операции с матрицами
      • Сложение двух матриц или сумма элементов массива Python
      • Умножение двух матриц Python
      • Транспонирование матрицы питон
    • Доступ к элементам матрицы, строкам и столбца
      • Доступ к элементам матрицы
      • Доступ к строкам матрицы
      • Доступ к столбцам матрицы
    • Разделение матрицы

    Python не имеет встроенного типа данных для матриц. Но можно рассматривать список как матрицу. Например:

    A = [[1, 4, 5], 
        [-5, 8, 9]]
    

    Этот список является матрицей на 2 строки и 3 столбца.

    Матрицы в Python

    Обязательно ознакомьтесь с документацией по спискам Python, прежде чем продолжить читать эту статью.

    Давайте посмотрим, как работать с вложенным списком.

    A = [[1, 4, 5, 12], 
        [-5, 8, 9, 0],
        [-6, 7, 11, 19]]
    
    print("A =", A) 
    print("A[1] =", A[1])      # вторая строка
    print("A[1][2] =", A[1][2])   # третий элемент второй строки
    print("A[0][-1] =", A[0][-1])   # последний элемент первой строки
    
    column = [];        # пустой список
    for row in A:
      column.append(row[2])   
    
    print("3rd column =", column)
    

    Когда мы запустим эту программу, результат будет следующий:

    A = [[1, 4, 5, 12], [-5, 8, 9, 0], [-6, 7, 11, 19]]
    A [1] = [-5, 8, 9, 0]
    A [1] [2] = 9
    A [0] [- 1] = 12
    3-й столбец = [5, 9, 11]
    

    Использование вложенных списков в качестве матрицы подходит для простых вычислительных задач. Но в Python есть более эффективный способ работы с матрицами – NumPy .

    NumPy – это расширение для научных вычислений, которое поддерживает мощный объект N-мерного массива. Прежде чем использовать NumPy, необходимо установить его. Для получения дополнительной информации,

    • Ознакомьтесь: Как установить NumPy Python?
    • Если вы работаете в Windows, скачайте и установите дистрибутив anaconda Python. Он поставляется вместе с NumPy и другими расширениями.

    После установки NumPy можно импортировать и использовать его.

    NumPy предоставляет собой многомерный массив чисел (который на самом деле является объектом). Давайте рассмотрим приведенный ниже пример:

    import numpy as np
    a = np.array([1, 2, 3])
    print(a)               # Вывод: [1, 2, 3]
    print(type(a))         # Вывод: <class 'numpy.ndarray'>
    

    Как видите, класс массива NumPy называется ndarray.

    Существует несколько способов создания массивов NumPy.

    import numpy as np
    
    A = np.array([[1, 2, 3], [3, 4, 5]])
    print(A)
    
    A = np.array([[1.1, 2, 3], [3, 4, 5]]) # Массив чисел с плавающей запятой
    print(A)
    
    A = np.array([[1, 2, 3], [3, 4, 5]], dtype = complex) # Массив составных чисел
    print(A)
    

    Когда вы запустите эту программу, результат будет следующий:

    [[1 2 3]
     [3 4 5]]
    
    [[1.1 2. 3.]
     [3. 4. 5.]]
    
    [[1. + 0.j 2. + 0.j 3. + 0.j]
     [3. + 0.j 4. + 0.j 5. + 0.j]]
    
    
    import numpy as np
    
    zeors_array = np.zeros( (2, 3) )
    print(zeors_array)
    
    '''
     Вывод:
     [[0. 0. 0.]
      [0. 0. 0.]]
    '''
    
    ones_array = np.ones( (1, 5), dtype=np.int32 ) // указание dtype
    print(ones_array)      # Вывод: [[1 1 1 1 1]]
    

    Здесь мы указали dtype – 32 бита (4 байта). Следовательно, этот массив может принимать значения от -2-31 до 2-31-1.

    import numpy as np
    
    A = np.arange(4)
    print('A =', A)
    
    B = np.arange(12).reshape(2, 6)
    print('B =', B)
    
    ''' 
    Вывод:
    A = [0 1 2 3]
    B = [[ 0  1  2  3  4  5]
     [ 6  7  8  9 10 11]]
    '''
    

    Узнайте больше о других способах создания массива NumPy .

    Выше мы привели пример сложение, умножение матриц и транспонирование матрицы. Мы использовали вложенные списки, прежде чем создавать эти программы. Рассмотрим, как выполнить ту же задачу, используя массив NumPy.

    Мы используем оператор +, чтобы сложить соответствующие элементы двух матриц NumPy.

    import numpy as np
    
    A = np.array([[2, 4], [5, -6]])
    B = np.array([[9, -3], [3, 6]])
    C = A + B      # сложение соответствующих элементов
    print(C)
    
    ''' 
    Вывод:
    [[11  1]
     [ 8  0]]
     '''
    

    Чтобы умножить две матрицы, мы используем метод dot(). Узнайте больше о том, как работает numpy.dot .

    Примечание: * используется для умножения массива (умножения соответствующих элементов двух массивов), а не умножения матрицы.

    import numpy as np
    
    A = np.array([[3, 6, 7], [5, -3, 0]])
    B = np.array([[1, 1], [2, 1], [3, -3]])
    C = a.dot(B)
    print(C)
    
    ''' 
    Вывод:
    [[ 36 -12]
     [ -1   2]]
    '''
    

    Мы используем numpy.transpose для вычисления транспонирования матрицы.

    import numpy as np
    
    A = np.array([[1, 1], [2, 1], [3, -3]])
    print(A.transpose())
    
    ''' 
    Вывод:
    [[ 1  2  3]
     [ 1  1 -3]]
    '''
    

    Как видите, NumPy значительно упростил нашу задачу.

    Также можно получить доступ к элементам матрицы, используя индекс. Начнем с одномерного массива NumPy.

    import numpy as np
    A = np.array([2, 4, 6, 8, 10])
    
    print("A[0] =", A[0])     # Первый элемент     
    print("A[2] =", A[2])     # Третий элемент     
    print("A[-1] =", A[-1])   # Последний элемент     
    

    Когда вы запустите эту программу, результат будет следующий:

    A [0] = 2
    A [2] = 6
    A [-1] = 10
    

    Теперь выясним, как получить доступ к элементам двухмерного массива (который в основном представляет собой матрицу).

    import numpy as np
    
    A = np.array([[1, 4, 5, 12],
        [-5, 8, 9, 0],
        [-6, 7, 11, 19]])
    
    #  Первый элемент первой строки
    print("A[0][0] =", A[0][0])  
    
    # Третий элемент второй строки
    print("A[1][2] =", A[1][2])
    
    # Последний элемент последней строки
    print("A[-1][-1] =", A[-1][-1])     
    

    Когда мы запустим эту программу, результат будет следующий:

    A [0] [0] = 1
    A [1] [2] = 9
    A [-1] [- 1] = 19
    
    import numpy as np
    
    A = np.array([[1, 4, 5, 12], 
        [-5, 8, 9, 0],
        [-6, 7, 11, 19]])
    
    print("A[0] =", A[0]) # Первая строка
    print("A[2] =", A[2]) # Третья строка
    print("A[-1] =", A[-1]) # Последняя строка (третья строка в данном случае)
    

    Когда мы запустим эту программу, результат будет следующий:

    A [0] = [1, 4, 5, 12]
    A [2] = [-6, 7, 11, 19]
    A [-1] = [-6, 7, 11, 19]
    
    import numpy as np
    
    A = np.array([[1, 4, 5, 12], 
        [-5, 8, 9, 0],
        [-6, 7, 11, 19]])
    
    print("A[:,0] =",A[:,0]) # Первый столбец
    print("A[:,3] =", A[:,3]) # Четвертый столбец
    print("A[:,-1] =", A[:,-1]) # Последний столбец (четвертый столбец в данном случае)
    

    Когда мы запустим эту программу, результат будет следующий:

    A [:, 0] = [1 -5 -6]
    A [:, 3] = [12 0 19]
    A [:, - 1] = [12 0 19]
    

    Если вы не знаете, как работает приведенный выше код, прочтите раздел “Разделение матрицы”.

    Разделение одномерного массива NumPy аналогично разделению списка. Рассмотрим пример:

    import numpy as np
    letters = np.array([1, 3, 5, 7, 9, 7, 5])
    
    # с 3-го по 5-ый элементы
    print(letters[2:5])        # Вывод: [5, 7, 9]
    
    # с 1-го по 4-ый элементы
    print(letters[:-5])        # Вывод: [1, 3]   
    
    # с 6-го до последнего элемента
    print(letters[5:])         # Вывод:[7, 5]
    
    # с 1-го до последнего элемента
    print(letters[:])          # Вывод:[1, 3, 5, 7, 9, 7, 5]
    
    # список в обратном порядке
    print(letters[::-1])          # Вывод:[5, 7, 9, 7, 5, 3, 1]
    

    Теперь посмотрим, как разделить матрицу.

    import numpy as np
    
    A = np.array([[1, 4, 5, 12, 14], 
        [-5, 8, 9, 0, 17],
        [-6, 7, 11, 19, 21]])
    
    print(A[:2, :4])  # две строки, четыре столбца
    
    ''' Вывод:
    [[ 1  4  5 12]
     [-5  8  9  0]]
    '''
    
    print(A[:1,])  # первая строка, все столбцы
    
    ''' Вывод:
    [[ 1  4  5 12 14]]
    '''
    
    print(A[:,2])  # все строки, второй столбец
    
    ''' Вывод:
    [ 5  9 11]
    '''
    
    print(A[:, 2:5])  # все строки, с третьего по пятый столбец
    ''' Вывод:
    [[ 5 12 14]
     [ 9  0 17]
     [11 19 21]]
    '''
    

    Использование NumPy вместо вложенных списков значительно упрощает работу с матрицами. Мы рекомендуем детально изучить пакет NumPy, если вы планируете использовать Python для анализа данных.

    Добавить комментарий