Я работаю с умножением матрицы, но у меня есть проблемы - PullRequest
0 голосов
/ 09 апреля 2019

Индекс 1 выходит за пределы для оси 0 с размером 1

, он отлично работает с умножением sq-матрицы, но при наличии проблемы с прямоугольной матрицей, пожалуйста, обнаружите ошибку

import numpy as np
A=np.array([[12,7,3],
    [4 ,5,6],
   [7 ,8,9]]) 
B=np.array([[1],[1],[1]])
r1,c1=A.shape
r2,c2=B.shape
C=np.array([[0 for j in range(c2)] for i in range(r1)])
if c1==r2:
    for k in range(r1):
        for i in range(c2+1):
            for j in range(c1):
                C[i][j]+=A[k][j]*B[j][i]
    print("Matrix After Multiplication \n\n",C)
else:
    print('Multiplication is not possible')

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Я думаю,

for i in range(c2+1):

выходит за пределы диапазона, поскольку

r2,c2=B.shape

, поэтому (c2 + 1) слишком велико.

Но

A=np.array([[12,7,3],
    [4 ,5,6],
   [7 ,8,9]]) 
B=np.array([[1],[1],[1]])

C = A@B
C

или

C = np.dot(A,B)
C

НАМНОГО более эффективен

0 голосов
/ 09 апреля 2019

Я не уверен, есть ли причина, по которой вы не используете встроенную функцию np.dot(), но если вам нужно явно сделать цикл for для умножения матриц, вы можете заменить ваш условный оператор наследующее:

if c1==r2:
    for col in range(c2):
        for row in range(r1):
            for i in range(r1):
                C[row][col] += A[row][i]*B[i][col]
    print("Matrix After Multiplication \n\n",C)
else:
    print('Multiplication is not possible')

Ваша результирующая матрица будет иметь размер r1 от c2.

Однако, если вы сможете использовать np.dot(), я бы порекомендовал вам следовать совету Пьяно.

C = np.dot(A, B)

Любой путь даст

C = [[22]
     [15]
     [24]]
...