Матричное умножение выдает ошибку, когда вторая матрица имеет только один столбец - PullRequest
0 голосов
/ 16 февраля 2019

Во-первых, довольно интересно задавать вопрос о переполнении стека, поскольку я давно хотел заняться кодированием, но на самом деле не смог начать.

Я пытаюсьсделать функцию умножения матриц в Python без , используя NumPy.Я почти закончил свой код, но я получаю сообщение об ошибке всякий раз, когда я пытаюсь умножить матрицу "A" на матрицу "B" только с одним столбцом.

Мой код выглядит следующим образом:

import numpy as np

def matrix_multiply(A,B):
row_A = len(A)
col_A = len(A[0])
row_B = len(B)
col_B = len(B[0])
if col_A != row_B:
    return("Invalid matrices")
else:
    result = np.zeros((col_B,row_A))
    for i in range(row_A): # iterate through columns of Y
        for j in range(col_B): # iterate through rows of Y
            for k in range(col_A):
                result[i][j] += A[i][k]*B[k][j]
    return result

Моя ошибка:

Traceback (most recent call last): File "<stdin>", line 1, in <module>
File "<stdin>", line 13, in matrix_multiply
IndexError: index 1 is out of bounds for axis 0 with size 1

Я предполагаю, что это проблема с "результатом [i] [j] + = A [i] [k] * B [k] [j] "part.

Мой код отлично работает для любой матрицы другого размера, но когда есть один столбец, я получаю эту ошибку индекса.Что происходит?

Вот пример:

A = np.array([[1,2,3],[2,3,4]])
B = np.array([[2,3],[4,5],[5,6]])

matrix_multiply(A,B)

array([[25., 31.],
   [36., 45.]])

Но когда я делаю ...

v = np.array([[4,3,1],[6,7,2]])
g = np.array([[3],[1],[4]])

matrix_multiply(v,g)

Я получаю ошибку.

1 Ответ

0 голосов
/ 16 февраля 2019

Как я уже говорил в моих комментариях, вам нужно поменять местами порядок индексов при заполнении матрицы result и затем выполнить транспонирование окончательного массива

Проблема: ваш индекс i работаетдлина row_A как for i in range(row_A) и индекс j работает на длине col_B как for j in range(col_B): НО , при определении пустого result массива вы меняете размеры, потому что вы используете result = np.zeros((col_B,row_A)), то есть сначала вы определяете размер столбца, а затем размер строки.Следовательно, либо вы меняете i и j внутри цикла for, как я это делал ниже, либо вы меняете переменные при инициализации result, а затем используете [i][j], как вы это делали.Тогда вам не понадобится транспонирование.

import numpy as np

def matrix_multiply(A,B):
    row_A = len(A)
    col_A = len(A[0])
    row_B = len(B)
    col_B = len(B[0])
    print (row_B, col_B)
    if col_A != row_B:
        return("Invalid matrices")
    else:
        result = np.zeros((col_B,row_A))
        for i in range(row_A): # iterate through columns of Y
            for j in range(col_B): # iterate through rows of Y
                for k in range(col_A):
                    result[j][i] += A[i][k]*B[k][j]
        return result

Пример 1

A = np.array([[1,2,3],[2,3,4]])
B = np.array([[2,3],[4,5],[5,6]])

result = matrix_multiply(A,B).T
print (result)

# array([[25., 31.],
#    [36., 45.]])

Пример 2

v = np.array([[4,3,1],[6,7,2]])
g = np.array([[3],[1],[4]])

result = matrix_multiply(v,g)
print (result)
# [[19. 33.]]
...