Друкарня від WE.UA

Всіх вітаю! У сьогоднішній статті ми поговоримо про те, як реалізувати добуток Кронекера у Python завдяки бібліотеці numpy. У рамках цієї статті ми розглянемо як використовувати функцію kron() та у чому суть добутку Кронекера.

Теорія та підготовка

Що таке добуток Кронекера?

Добуток Кронекера — це такий добуток, у ході якого множенням кожного елемента першої матриці на всю другу матрицю ми отримуємо нову ще більшу матрицю. Невід’ємною особливістю добутку Кронекера також є й той факт, що його можна обчислювати для абсолютно будь-яких за розміром двох матриць

Наприклад, ми маємо такі дві матриці:

Наші матриці

Ось приклад обчислення добутку Кронекера звичайним математичним записом:

Алгоритм вирішення

Всі приклади з іншими матрицями обчислюються абсолютно таким самим чином. У нас завжди будуть матриці A та B, але різних розмірів. Тобто, якщо матриця A буде розміром 2×2, то кожен з чотирьох її елементів буде множитися на всю матрицю B.

Встановлення numpy

Windows:

pip install numpy

MacOS:

pip3 install numpy

Linux:

pip install numpy

Реалізація у коді через функцію kron()

Для матриць 3×3

Спочатку імпортуємо бібліотеку numpy:

import numpy as np

Створюємо дві матриці a та b:

a = np.array(
[
    [1, 5, 8],
    [9, 8, 4],
    [0, 2, 6]
]
)

b = np.array(
[
    [2, 2, 2],
    [3, 4, 1],
    [10, 5, 7]
]
)

У numpy добуток Кронекера реалізовується за допомогою функції kron(), якій ми передаємо у якості параметрів дві матриці будь-яких розмірів.

Тепер просто обчислюємо добуток Кронекера для наших матриць:

kronecker_product = np.kron(a, b)
print(f"Result:\n"
      f"{kronecker_product}")

Ось повний код нашої програми:

import numpy as np

a = np.array(
[
    [1, 5, 8],
    [9, 8, 4],
    [0, 2, 6]
]
)

b = np.array(
[
    [2, 2, 2],
    [3, 4, 1],
    [10, 5, 7]
]
)

kronecker_product = np.kron(a, b)
print(f"Result:\n"
      f"{kronecker_product}")

А ось отриманий результат:

Result:
[[ 2  2  2 10 10 10 16 16 16]
 [ 3  4  1 15 20  5 24 32  8]
 [10  5  7 50 25 35 80 40 56]
 [18 18 18 16 16 16  8  8  8]
 [27 36  9 24 32  8 12 16  4]
 [90 45 63 80 40 56 40 20 28]
 [ 0  0  0  4  4  4 12 12 12]
 [ 0  0  0  6  8  2 18 24  6]
 [ 0  0  0 20 10 14 60 30 42]]

Ось ще один приклад:

import numpy as np

a = np.array(
[
    [6, -10, 22],
    [0, -35, 20],
    [11, 47, 51]
]
)

b = np.array(
[
    [-9, 0, 77],
    [32, 41, -84],
    [-10, 12, 62]
]
)

kronecker_product = np.kron(a, b)
print(f"Result:\n"
      f"{kronecker_product}")
Result:
[[  -54     0   462    90     0  -770  -198     0  1694]
 [  192   246  -504  -320  -410   840   704   902 -1848]
 [  -60    72   372   100  -120  -620  -220   264  1364]
 [    0     0     0   315     0 -2695  -180     0  1540]
 [    0     0     0 -1120 -1435  2940   640   820 -1680]
 [    0     0     0   350  -420 -2170  -200   240  1240]
 [  -99     0   847  -423     0  3619  -459     0  3927]
 [  352   451  -924  1504  1927 -3948  1632  2091 -4284]
 [ -110   132   682  -470   564  2914  -510   612  3162]]

Для матриць різних розмірів

Як вже було сказано на початку, добуток Кронекера можна обчислювати для матриць різних розмірів. Ось приклад, де ми маємо різні за розміром матриці, але все одно можемо обчислити добуток Кронекера:

import numpy as np


a = np.array(
[
    [12, 0],
    [8, 7],
    [-2, -4],
    [1, 9]
]
)

b = np.array(
[
    [1, 5, 0, 10],
    [12, 3, 2, 7],
    [5, 8, 4, 3]
]
)

kronecker_product = np.kron(a, b)
print(f"Result:\n"
      f"{kronecker_product}")
Result:
[[ 12  60   0 120   0   0   0   0]
 [144  36  24  84   0   0   0   0]
 [ 60  96  48  36   0   0   0   0]
 [  8  40   0  80   7  35   0  70]
 [ 96  24  16  56  84  21  14  49]
 [ 40  64  32  24  35  56  28  21]
 [ -2 -10   0 -20  -4 -20   0 -40]
 [-24  -6  -4 -14 -48 -12  -8 -28]
 [-10 -16  -8  -6 -20 -32 -16 -12]
 [  1   5   0  10   9  45   0  90]
 [ 12   3   2   7 108  27  18  63]
 [  5   8   4   3  45  72  36  27]]

Також ще один приклад:

import numpy as np


a = np.array(
[
    [45],
    [23],
    [81]
]
)

b = np.array(
[
    [53, -12],
    [91, -34]
]
)

kronecker_product = np.kron(a, b)
print(f"Result:\n"
      f"{kronecker_product}")
Result:
[[ 2385  -540]
 [ 4095 -1530]
 [ 1219  -276]
 [ 2093  -782]
 [ 4293  -972]
 [ 7371 -2754]]

Висновок

У цій статті ми доволі просто й зрозуміло навчилися обчислювати добуток Кронекера у Python, користуючись бібліотекою numpy. Також важливим є й те, що ми розглянули й теоретичні задасади даного математичного прийому, що дало нам більше розуміння.

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Magnifique numérique
Magnifique numérique@nocturnal_reader we.ua/nocturnal_reader

Нічний читач

53Довгочити
594Прочитання
17Підписники
Підтримати
На Друкарні з 14 липня

Більше від автора

  • Метод split() у Python

    Всіх вітаю! Сьогодні ми розглянемо метод split() у Python та побачимо, як використовувати її на прикладах.

    Теми цього довгочиту:

    Програмування
  • Створюємо стовпчикові графіки за допомогою plotly

    Всіх вітаю! У цій статті пропоную вам зануритися у графіки та візуалізацію на Python за допомогою plotly. На цей раз ми втілимо графік прослуховувань різних реп виконавців за місяць та графік з оцінками деяких альбомів за сайтом AOTY.

    Теми цього довгочиту:

    Програмування
  • Методи lower(), upper(), islower() та isupper() у Python

    Всіх вітаю! У цій невеличкій статті ми познайомимося із одразу чотирма методами для зміни регістру рядків у Python. Конкретно сьогодні ми ознайомимося із методами lower(), upper(), islower() та isupper().

    Теми цього довгочиту:

    Програмування

Це також може зацікавити:

Коментарі (8)

Можливо мене не зрозуміють, але воно мені дико нагадує тензорний добуток. Таке ж позначення ⊗. Просто тут може бути особлива умова “згортки” для множення таких “блочних” матриць. Просто моя логіка в тому, що це ніби 4-кратний тензорний, але ж не буде, бо “як тоді це не “просторова” матриця 3×3×3×3 ?”. 2 Варіанти: дужки (V⊗V)⊗(V⊗V), або ми взяли коефіцієнти не дійсні числа, а такі ж матриці. І це вже такий модуль, а не векторний простір. Хоча мета просто в алгоритмах, напевне якісь обчислення простіше.

Це також може зацікавити: