【问题标题】:Matrix multiplication throwing an error when second matrix has only one column当第二个矩阵只有一列时,矩阵乘法会引发错误
【发布时间】:2019-02-16 16:27:48
【问题描述】:

首先,我很高兴能在 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[j][i] += A[i][k]*B[k][j]。我在result 中交换了ij。看result = np.zeros((col_B,row_A))你就会明白
  • 我这样做了,但是在与 np.matmul(A,B) 进行比较时,轴被交换为点积。我应该只使用 np.swapaxes(),还是有更“优雅”的解决方案?
  • 您可以将最终结果转置为result = result.T。您没有提供任何数据来试用您的代码,因此我们只能提供建议而不是有效的答案
  • 哦,抱歉,我还在学习如何提供信息和提出正确的问题。我会编辑我原来的帖子:)

标签: python matrix matrix-multiplication multiplication


【解决方案1】:

正如我在 cmets 中所说,您需要在填充 result 矩阵时交换索引顺序,然后对最终数组进行转置

问题:您的索引irow_A 的长度上运行为for i in range(row_A),索引jcol_B 的长度上运行为for j in range(col_B): ,同时定义为空result 数组您交换维度,因为您使用 result = np.zeros((col_B,row_A)),即您首先定义列维度,然后定义行维度。因此,要么像我在下面所做的那样在 for 循环中交换 ij,要么在初始化 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.]]

【讨论】:

  • 太有趣了。你知道为什么需要转置,或者为什么会出现这种怪癖吗?我仍然习惯于 Python 的操作方式,所以我想知道为什么转置是必要的,而不仅仅是“result[j][i]”。谢谢,这确实有效!
  • @an_altar_of_plagues:检查我编辑的答案中的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2017-03-11
  • 2013-12-23
  • 1970-01-01
相关资源
最近更新 更多