Друкарня від 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. Також важливим є й те, що ми розглянули й теоретичні задасади даного математичного прийому, що дало нам більше розуміння.

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

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

Нічний читач

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

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

  • Методи title() та istitle() у Python

    Всіх вітаю! У цій статті ми розглянемо методи title() та istitle(), продовжуючи тему методів для рядків у Python.

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

    Програмування
  • Різниця між методами isnumeric(), isdigit() та isdecimal() у Python

    Всіх вітаю! У даній статті ми поговоримо про методи визначення вмісту рядка за допомогою таких вбудованих методів як isnumeric(), isdigit() та isdecimal(). Також ми з’ясуємо різницю між цими трьома методами та як ними корисуватися.

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

    Програмування
  • Створюємо надійний генератор паролів та визначаємо ентропію отриманого пароля

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

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

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

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

  • Чому у програмістів важка робота

    Програмісти стикаються з викликами, оскільки 85% коду проекту - сторонні бібліотеки, які потребують постійного оновлення. Ринок ПЗ конкурентний, інновації часто неефективні, але необхідні для утримання позицій. Це призводить до вигорання, незважаючи на високу оплату.

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

    Програмування
  • Як AWS S3 витискає 1 ПБ/с із повільних HDD?

    Ви коли-небудь замислювалися, як гігантські хмарні сервіси, на кшталт Amazon S3, примудряються миттєво віддавати величезні обсяги даних, маючи під капотом звичайні жорсткі диски?

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

    Сервер
  • Потрохи беруся за розум

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

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

    Зміна Пріоритетів

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

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

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

  • Чому у програмістів важка робота

    Програмісти стикаються з викликами, оскільки 85% коду проекту - сторонні бібліотеки, які потребують постійного оновлення. Ринок ПЗ конкурентний, інновації часто неефективні, але необхідні для утримання позицій. Це призводить до вигорання, незважаючи на високу оплату.

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

    Програмування
  • Як AWS S3 витискає 1 ПБ/с із повільних HDD?

    Ви коли-небудь замислювалися, як гігантські хмарні сервіси, на кшталт Amazon S3, примудряються миттєво віддавати величезні обсяги даних, маючи під капотом звичайні жорсткі диски?

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

    Сервер
  • Потрохи беруся за розум

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

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

    Зміна Пріоритетів