当第二个矩阵只有一列时,矩阵乘法会抛出错误
Matrix multiplication throwing an error when second matrix has only one column
首先,很高兴能在 Stack Overflow 上提问,因为我一直想从事编码工作,但一直未能真正开始。
我正在尝试使用 NumPy 在 Python 中创建矩阵乘法函数而不使用 。我几乎完成了我的代码,但每当我尝试将矩阵 "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
我认为这是 "result[i][j] += A[i][k]*B[k][j]" 部分的问题。
我的代码适用于任何其他大小的矩阵,但当只有一列时,我会收到此索引错误。怎么回事?
这是一个例子:
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)
我收到错误。
正如我在评论中所说,您需要在填充 result
矩阵时交换索引的顺序,然后对最终数组进行转置
问题:您的索引 i
在 row_A
的长度上运行为 for i in range(row_A)
,索引 j
在 col_B
的长度上运行为 for j in range(col_B):
BUT 在定义空 result
数组时交换维度,因为您使用 result = np.zeros((col_B,row_A))
,即首先定义列维度,然后定义行维度。因此,您要么像我在下面所做的那样在 for 循环中交换 i
和 j
,要么在初始化 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.]]
首先,很高兴能在 Stack Overflow 上提问,因为我一直想从事编码工作,但一直未能真正开始。
我正在尝试使用 NumPy 在 Python 中创建矩阵乘法函数而不使用 。我几乎完成了我的代码,但每当我尝试将矩阵 "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
我认为这是 "result[i][j] += A[i][k]*B[k][j]" 部分的问题。
我的代码适用于任何其他大小的矩阵,但当只有一列时,我会收到此索引错误。怎么回事?
这是一个例子:
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)
我收到错误。
正如我在评论中所说,您需要在填充 result
矩阵时交换索引的顺序,然后对最终数组进行转置
问题:您的索引 i
在 row_A
的长度上运行为 for i in range(row_A)
,索引 j
在 col_B
的长度上运行为 for j in range(col_B):
BUT 在定义空 result
数组时交换维度,因为您使用 result = np.zeros((col_B,row_A))
,即首先定义列维度,然后定义行维度。因此,您要么像我在下面所做的那样在 for 循环中交换 i
和 j
,要么在初始化 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.]]