Множення матриць є фундаментальною операцією лінійної алгебри.
Зазвичай ми використовуємо його в багатьох програмах, таких як обробка зображень, машинне навчання тощо. NumPy — це відомий пакет Python для наукових обчислень.
Однак у цій публікації ми розглянемо різні методи множення матриць у Python без використання NumPy.
Будемо використовувати вкладені петлі, вбудовану функцію map() і розуміння списку.
Крім того, ми розглянемо переваги та недоліки кожної стратегії, а також, коли застосовувати кожну з них. Якщо ви новачок у лінійній алгебрі та хочете дізнатися більше про множення матриць; продовжуйте читати.
Де ми використовуємо множення матриць?
Матричне множення використовується в комп'ютерна графіка щоб змінити 2D і 3D візуалізацію. Наприклад, ви можете обертати, масштабувати та перекладати об’єкти на екрані. Матриці використовуються в обробці зображень для представлення зображень у вигляді масивів пікселів. Крім того, матриці можна використовувати для виконання таких операцій, як фільтрація зображень.
Ми також використовуємо матриці в навчання за допомогою машини. Вони можуть допомогти нам представити дані та параметри моделі. Ми можемо виконувати численні операції, такі як обчислення скалярних добутків і матриць-векторних добутків.
Безсумнівно, ця операція також дуже вигідна в наукових операціях. Ми можемо використовувати його у фізиці та техніці для опису фізичних величин. Отже, ми можемо оперувати векторами та тензорами.
Чому ми не можемо вибрати використання NumPy?
Хоча NumPy є a Бібліотека Python, це не завжди ідеальний варіант для множення матриць. Ми можемо не використовувати NumPy через розмір і залежність, навчання та застарілі системи.
Використання вбудованих функцій Python або розробка спеціального коду може бути ефективнішим у деяких випадках. Однак важливо відзначити, що NumPy є потужною бібліотекою. Крім того, ви також можете використовувати його для множення матриць.
Тепер давайте подивимося, як ми можемо досягти множення матриці без NumPy.
Метод вкладених циклів
Техніка вкладених циклів використовує вкладені цикли для виконання множення матриці в Python. Функція повторює кожен елемент матриці. І він помножує їх за допомогою ряду вкладених циклів. Функція повертає результат, який зберігається в новій матриці.
Цей підхід легко зрозуміти. Однак він може бути не таким ефективним, як інші способи, особливо для великих матриць. Тим не менш, це чудовий вибір для вас, якщо ви новачок у лінійній алгебрі.
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# Встановити матрицю результатів на нулі.
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
Давайте наведемо приклад, як це зробити. Ви можете просто додати ці рядки коду нижче, щоб перевірити цей приклад.
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
Переваги:
- Легко зрозуміти.
- Чудово підходить для новачків або тих, хто хоче глибше зрозуміти множення матриць.
Недоліки:
- Не такий ефективний, як альтернативні методи, особливо для великих матриць.
- Він не такий читабельний, як альтернативні підходи.
метод функції map().
Метод функції map() забезпечує альтернативний підхід до множення матриць у Python. У цьому підході ми використовуємо вбудовану функцію map(). Отже, ми використовуємо інструмент функціонального програмування, який застосовує надану функцію до кожного ітерованого елемента (списку, кортежу тощо). Крім того, функція map() приймає два параметри, функцію та iterable. І повертає ітератор, який застосовує функцію до кожного ітерованого елемента.
У цьому підході ми переглядаємо кожен член матриці та виконуємо множення за допомогою вкладеної функції map().
Функція zip() використовується для паралельного проходження кожного елемента матриці.
Нарешті, функція sum() використовується для додавання результатів.
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
Тепер знову ми можемо перевірити наш код на прикладі.
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
Переваги
- Більш ефективний, ніж підхід із накопиченням петель
- Він використовує функціональне програмування, щоб спростити код.
Недоліки
- Деякі люди, які не знайомі з функціональним програмуванням, можуть вважати його менш читабельним.
- Це менш зрозуміло, ніж техніка вкладених циклів.
Метод розуміння списку
Розуміння списків дає змогу створити новий список в одному рядку коду. Отже, це відбувається шляхом застосування виразу до кожного члена існуючого списку.
У цьому підході множення виконується шляхом багаторазового проходження кожного члена матриці. Ми використовуємо багаторівневе розуміння списку.
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
Переваги
- Порівняно з методом функції map(), коротший і більш читабельний.
Недоліки
- Це може бути менш ефективним, ніж використання функції map(), особливо для великих матриць.
- Це складніше, ніж підхід вкладених циклів.
Висновок
У цій публікації ми розглянули альтернативи використання NumPy під час множення матриць у Python. Ми виконали множення матриць у вкладених циклах, вбудовану функцію map() і розуміння списку.
Найкраща стратегія буде залежати від конкретних потреб вашого проекту.
Кожна зі стратегій має свої плюси і мінуси. Щоб переконатися, що функція працює належним чином, доцільно додати кілька тестів із різними розмірами та значеннями матриці.
Ви також повинні включити деякі тести продуктивності, щоб порівняти, наскільки добре виконуються ці методи.
залишити коментар