С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/41: Рейтинг темы: голосов - 41, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 18.05.2021
Сообщений: 19

Произведение 3 матриц

23.05.2021, 20:59. Показов 8624. Ответов 9

Студворк — интернет-сервис помощи студентам
Пытаюсь написать функция умножения 3 матриц, без использования n.dot и @

В результате получаю непонятную конечную матрицу

Python
1
2
3
4
5
6
7
8
9
10
import numpy as np
 
matrix1 = np.array([[1, 2, 3], [4, 5, 6], [3, 2, 9]])     
matrix2 = np.array([[3, 6, 4], [9, 5, 3], [1, 4, 4]])   
matrix3 = np.array([[2, 5, 7], [5, 0, 7], [2, 5, 5]])   
 
def prod_matrix(matrix1, matrix2, matrix3):
  f=lambda x: matrix1 * matrix2 * matrix3
  return f  
print(x)
[[1 2 3]
[4 5 6]]

Подскажите в чем ошибка?

Добавлено через 39 минут
Вроде так нормально получилось

Python
1
2
3
4
5
def prod_matrix(x, y, z):
  return x * y * z
    
matrix4 = prod_matrix(matrix1, matrix2, matrix3)
print(matrix4)
[[ 6 60 84]
[180 0 126]
[ 6 40 180]]
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.05.2021, 20:59
Ответы с готовыми решениями:

Произведение 3 матриц
Есть 3 матрицы matrix1 = np.array(, ]) matrix2 = np.array(, , ]) matrix3 = np.array(, ]) Надо написать функцию их умножения.

Произведение матриц
Программа читает три числа m, n, r. Затем m строк по n элементов, которые задают матрицу A (m×n). После этого n строк по r элементов,...

Найти произведение двух матриц
Даны матрицы А и В размера k×m и m×l соответственно. Найти произведение АВ.

9
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,757
23.05.2021, 22:04
Лучший ответ Сообщение было отмечено Ai-xander как решение

Решение

Ai-xander, это не матричное умножение, а поэлементное. Для матричного используется @.
2
 Аватар для Hawaiian pilot
3 / 3 / 0
Регистрация: 18.05.2021
Сообщений: 93
04.10.2021, 22:24
та же задача.
Python
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
       # Функция матричного умножения, принимающая на вход 3 матрицы
def prod_matrix(matrix1, matrix2, matrix3):
  shape1 = matrix1.shape  # определим форму 1-ой матрицы
  shape2 = matrix2.shape  # определим форму 2-ой матрицы
  shape3 = matrix3.shape  # определим форму 3-ей матрицы
  
  if shape1[1] != shape2[0]:  # если количество столбцов 1-ой матрицы не равно количеству строк 2-ой матрицы
    return np.array([])        # тогда умножение невозможно, возвращаем пустой массив
  if shape1[1] != shape3[0]:  # если количество столбцов 1-ой матрицы не равно количеству строк 3-ой матрицы
    return np.array([])        # тогда умножение невозможно, возвращаем пустой массив
  
  out_matrix = np.zeros((shape1[0], shape2[1]))  # создадим матрицу из 0, формой (количество строк 1-ой)Х(количество столбцов 2-ой) матриц
  tot_matrix = np.zeros((shape1[0], shape2[1]))  # создадим матрицу из 0, формой (количество строк 1-ой)Х(количество столбцов 2-ой) матриц
  
  for i in range(shape1[0]):  # пройдемся по индексам строк 1-ой матрицы
    for j in range(shape2[1]):  # пройдемся по индексам столбцов 2-ой матрицы
      curr_cell = 0
      for t in range(shape1[1]):  # пройдемся по индексам стобцов 1-ой матрицы
        curr_cell += matrix1[i,t] * matrix2[t,j]  # посчитаем сумму произведения элементов строки 1-ой матрицы и столбцов 2-ой матрицы
      out_matrix[i,j] = curr_cell  # заменим значения в матрице состоящих из 0, на посчитанную сумму произведений
      shape4 = out_matrix.shape # определим форму полученной матрицы
      for i in range(shape4[0]):  # пройдемся по индексам строк полученной матрицы
        for k in range(shape3[1]):  # пройдемся по индексам столбцов 3-ей матрицы
          curr_celltot = 0
          for j in range(shape4[1]):  # пройдемся по индексам стобцов полученной матрицы
            curr_celltot += out_matrix[i,j] * matrix3[j,k]  # посчитаем сумму произведения элементов строки полученной матрицы и столбцов 3-ей матрицы
            tot_matrix[i,k] = curr_celltot  # заменим значения в матрице состоящих из 0, на посчитанную сумму произведений
 
  return tot_matrix  # вернем полученную матрицу
При проверке:

Python
1
prod_matrix([[0, 1, 2], [1, 2, 3], [2, 3, 4]],[[0, 1, 2], [1, 2, 3], [2, 3, 4]],[[0, 1, 2], [1, 2, 3], [2, 3, 4]])
Python
1
AttributeError: 'list' object has no attribute 'shape'
В чем недоработка?
0
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
04.10.2021, 22:31
Python
1
2
3
4
5
import numpy as np
A = np.matrix(a) # matrix example: a = [[1, 2], [3, 4]]
B = np.matrix(b) # matrix
C = np.matrix(c) # matrix
D = A*B*C
https://numpy.org/doc/stable/r... atrix.html
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
04.10.2021, 22:35
Цитата Сообщение от Hawaiian pilot Посмотреть сообщение
AttributeError: 'list' object has no attribute 'shape'
Вообще стоило бы писать хоть в какой строке ошибка. Но я попробую угадать.
Python
1
2
3
  shape1 = matrix1.shape  # определим форму 1-ой матрицы
  shape2 = matrix2.shape  # определим форму 2-ой матрицы
  shape3 = matrix3.shape  # определим форму 3-ей матрицы
0
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
04.10.2021, 22:37
Python
1
2
3
4
5
6
7
import numpy as np
 
def func(a:list,b:list,c:list)->np.matrix:
    A = np.matrix(a) # matrix example: a = [[1, 2], [3, 4]]
    B = np.matrix(b) # matrix
    C = np.matrix(c) # matrix
    return A*B*C
1
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
04.10.2021, 22:39
Цитата Сообщение от Hawaiian pilot Посмотреть сообщение
В чем недоработка?
Перевожу. У списка нет атрибута "shape".
Вы на вход функции пихаете обычный список. А внутри хотите работать с ним как с матрицей из numpy.
0
 Аватар для Hawaiian pilot
3 / 3 / 0
Регистрация: 18.05.2021
Сообщений: 93
04.10.2021, 23:04
anton78spb,
пихаю все по теме)
выше же матрица в примере
Python
1
prod_matrix([[0, 1, 2], [1, 2, 3], [2, 3, 4]],[[0, 1, 2], [1, 2, 3], [2, 3, 4]],[[0, 1, 2], [1, 2, 3], [2, 3, 4]])
но такое же пальто с другой задачей :
Напишите функцию, которая считает разницу между максимальным и минимальным элементами матрицы
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def difference(matr):
  min_x = min(matr)
  max_x = max(matr)
  y = max(matr) - min(matr) 
  return y
difference([[1, 2], [3, 4]])
      2   min_x = min(matr)
      3   max_x = max(matr)
----> 4   y = max(matr) - min(matr)
      5   return y
      6 
 
TypeError: unsupported operand type(s) for -: 'list' and 'list'
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
05.10.2021, 00:06
Цитата Сообщение от Hawaiian pilot Посмотреть сообщение
пихаю все по теме)
Нифига не теме
Я посмотрев на вашу матрицу и сказал в чем ошибка.
Наберите код
Python
1
print(type([[0, 1, 2], [1, 2, 3], [2, 3, 4]]))
И посмотрите что там будет написано.
А будет там написано:
Python
1
<class 'list'>
Потом можете набрать
Python
1
print(list.__dict__)
Получите список того, что есть у списков. И там не будет метода 'shape', который вы пытаетесь вызвать.

Добавлено через 8 минут
Цитата Сообщение от Hawaiian pilot Посмотреть сообщение
Напишите функцию, которая считает разницу между максимальным и минимальным элементами матрицы
Цитата Сообщение от Hawaiian pilot Посмотреть сообщение
Python
1
2
3
4
5
6
def difference(matr):
  min_x = min(matr)
  max_x = max(matr)
  y = max(matr) - min(matr) 
  return y
difference([[1, 2], [3, 4]])
Это так не работает.
Даже если бы работало. Ответьте себе, зачем тут строки 2 и 3? Зачем вы это вычисляете, если потом нигде не используете.
Но оно не будет так работать. Добавьте сюда пару строчек print, и посмотрите что у вас в переменных min_x и min_y, если уж вы их "посчитали". Там будет не число как вам это хочется.
Python
1
2
3
4
5
6
7
8
def difference(matr):
  min_x = min(matr)
  print(min_x)
  max_x = max(matr)
  print(min_y)
  y = max(matr) - min(matr) 
  return y
difference([[1, 2], [3, 4]])
Добавлено через 4 минуты
Это вот так надо писать, чтобы работало.
Python
1
2
3
4
5
6
import numpy as np
 
def difference(matr):
  return matr.max() - matr.min()
  
print(difference(np.array([[1, 2], [3, 4]])))
1
 Аватар для Hawaiian pilot
3 / 3 / 0
Регистрация: 18.05.2021
Сообщений: 93
14.11.2021, 01:08
вернусь к задаче.
я наверное сильно слепошарая, но с отступами проблемы не нахожу в 23й строчке(((
нужно ее добить. Помогите плиз

Python
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
       # Функция матричного умножения, принимающая на вход 3 матрицы
def prod_matrix(matrix1, matrix2, matrix3):
  shape1 = matrix1.shape  # определим форму 1-ой матрицы
  shape2 = matrix2.shape  # определим форму 2-ой матрицы
  shape3 = matrix3.shape  # определим форму 3-ей матрицы
  
  if shape1[1] != shape2[0]:  # если количество столбцов 1-ой матрицы не равно количеству строк 2-ой матрицы
    return np.array([])        # тогда умножение невозможно, возвращаем пустой массив
  if shape1[1] != shape3[0]:  # если количество столбцов 1-ой матрицы не равно количеству строк 3-ой матрицы
    return np.array([])        # тогда умножение невозможно, возвращаем пустой массив
  
  out_matrix = np.zeros((shape1[0], shape2[1]))  # создадим матрицу из 0, формой (количество строк 1-ой)Х(количество столбцов 2-ой) матриц
  tot_matrix = np.zeros((shape1[0], shape2[1]))  # создадим матрицу из 0, формой (количество строк 1-ой)Х(количество столбцов 2-ой) матриц
  
  for i in range(shape1[0]):  # пройдемся по индексам строк 1-ой матрицы
 
    for j in range(shape2[1]):  # пройдемся по индексам столбцов 2-ой матрицы
      curr_cell = 0
 
      for t in range(shape1[1]):
 
        # пройдемся по индексам стобцов 1-ой матрицы
        curr_cell += matrix1[i,t] * matrix2[t,j]  # посчитаем сумму произведения элементов строки 1-ой матрицы и столбцов 2-ой матрицы
      out_matrix[i,j] = curr_cell  # заменим значения в матрице состоящих из 0, на посчитанную сумму произведений
 
      for i in range(shape4[0]):  # пройдемся по индексам строк полученной матрицы
        for k in range(shape3[1]):  # пройдемся по индексам столбцов 3-ей матрицы
          curr_celltot = 0
          for j in range(shape4[1]):  # пройдемся по индексам стобцов полученной матрицы
            curr_celltot += out_matrix[i,j] * matrix3[j,k]  # посчитаем сумму произведения элементов строки полученной матрицы и столбцов 3-ей матрицы
            tot_matrix[i,k] = curr_celltot  # заменим значения в матрице состоящих из 0, на посчитанную сумму произведений
 
  return tot_matrix  # вернем полученную матрицу
Python
1
2
3
4
  File "<ipython-input-9-95c897a9cd70>", line 23
    curr_cell += matrix1[i,t] * matrix2[t,j]  # посчитаем сумму произведения элементов строки 1-ой матрицы и столбцов 2-ой матрицы
                                                                                                                                  ^
IndentationError: unindent does not match any outer indentation level
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2021, 01:08
Помогаю со студенческими работами здесь

Произведение матриц
Нужно реализовать функцию выполнения произведение матриц с рандомными числами (Матрица 2го порядка). Пожалуйста, помогите.. Не понимаю,...

Найти произведение матриц
Даны 2 матрицы действительных чисел: A, размером n×m, и B, размером m×k. Найдите произведение матриц. Входные данные В первой строке...

Найти произведение матриц
Даны две матрицы 4*4, состоящие из целых чисел от 1 до 10. Найти произведение этих матриц

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru