Условие:
Перемножьте две матрицы!
На вход программе подаются две матрицы, каждая в следующем формате: на первой строке два целых положительных числа (n) и (m), разделенных пробелом - размерность матрицы. В следующей строке находится (n \cdot m) целых чисел, разделенных пробелами - элементы матрицы. Подразумевается, что матрица заполняется построчно, то есть первые (m) чисел - первый ряд матрицы, числа от (m+1) до (2 \cdot m) - второй, и т.д.
Напечатайте произведение матриц (XY^T), если они имеют подходящую форму, или строку "matrix shapes do not match", если формы матриц не совпадают должным образом.
В этот раз мы проделали за вас подготовительную работу по считыванию матриц (когда вы начнёте решать, этот код будет уже написан): \nx_shape = tuple(map(int, input().split()))\nX = np.fromiter(map(int, input().split()), np.int).reshape(x_shape)
Несколько комментариев: \nmap(f, iterable, …) — встроенная функция языка Python, возвращает результат поэлементного применения функции f к элементам последовательности iterable; если f принимает несколько аргументов, то на вход должно быть подано соответствующее число последовательностей: результатом map(f, x, y, z) будет итератор, возвращающий поочерёдно f(x[0], y[0], z[0]), f(x[1], y[1], z[1]), f(x[2], y[2], z[2]) и так далее; результат применения f к очередному набору аргументов вычисляется только тогда, когда требуется использовать этот результат, но не ранее, подробнее и короче в справке;\nnp.fromiter создаёт NumPy-массив из итератора, то есть заставляет итератор вычислить все доступные значения и сохраняет их в массив;\ninput() — встроенная функция языка Python, читает одну строку (последовательность символов вплоть до символа переноса строки) из входного потока данных и возвращает её как строку;\nsplit() — метод класса string, возвращает список слов в строке (здесь слова — последовательности символов, разделённые пробельными символами); принимает дополнительные аргументы, подробнее в справке.
Напишите программу.

