【问题标题】:matrix using python使用python的矩阵
【发布时间】:2013-03-22 03:14:17
【问题描述】:

我是 python 新手,我正在编写一个来自矩阵的程序,但是有一个问题我不知道如何获得正确的输出,我需要帮助。 这就是问题:给定一个 nXn 矩阵 A 和一个 kXn 矩阵 B 找到 AB 。 这就是我到目前为止所拥有的。提前谢谢你

def matrixmult (A, B):
    rows_A = len(A)
    cols_A = len(A[0])
    rows_B = len(B)
    cols_B = len(B[0])

    if cols_A != rows_B:
      print "Cannot multiply the two matrices. Incorrect dimensions."
      return

    # Create the result matrix
    # Dimensions would be rows_A x cols_B
    C = [[0 for row in range(cols_B)] for col in range(rows_A)]
    print C

    for i in range(rows_A):
        for j in range(cols_B):
            for k in range(cols_A):
                C[i][j] += A[i][k]*B[k][j]
    return C

【问题讨论】:

  • 我没有看到任何明显的错误。你有没有得到错误答案的示例输入?
  • 实际上没有,但是当我运行它时,我没有得到任何输出!
  • 当你说你没有得到输出时,你的意思是它不打印任何东西,返回值是None,还是别的什么?哦,在您发布的代码中,return C 应该在第 4 列而不是第 3 列。您的帖子中有错字吗?
  • 它返回值无
  • 如果 cols_A != rows_B 它将返回 None

标签: python


【解决方案1】:

一个班轮:

def matrixmult(m1, m2):
    return [
        [sum(x * y for x, y in zip(m1_r, m2_c)) for m2_c in zip(*m2)] for m1_r in m1
    ]

解释:

zip(*m2) - 从第二个矩阵中获取一列

zip(m1_r, m2_c) - 从 m1 行和 m2 列创建元组

sum(...) - 对乘法行求和 * col

测试:

m1 = [[1, 2, 3], [4, 5, 6]]
m2 = [[7, 8], [9, 10], [11, 12]]
result = matrixmult(m1, m2)
assert result == [[58, 64], [139, 154]]

【讨论】:

    【解决方案2】:

    你的功能:

    def matrixmult (A, B):
        rows_A = len(A)
        cols_A = len(A[0])
        rows_B = len(B)
        cols_B = len(B[0])
    
        if cols_A != rows_B:
          print "Cannot multiply the two matrices. Incorrect dimensions."
          return
    
        # Create the result matrix
        # Dimensions would be rows_A x cols_B
        C = [[0 for row in range(cols_B)] for col in range(rows_A)]
        print C
    
        for i in range(rows_A):
            for j in range(cols_B):
                for k in range(cols_A):
                    C[i][j] += A[i][k]*B[k][j]
        return C
    

    这似乎与this function 相同。

    如果我运行这个:

    matrix=[[1,2,3],
        [4,5,6],
        [7,8,9]]
    
    print matrixmult(matrix, matrix)    # that is your function...
    

    返回:

    [[30, 36, 42], [66, 81, 96], [102, 126, 150]]
    

    这和 Numpy 一样:

    import numpy as np
    
    a=np.array(matrix)
    b=np.array(matrix)
    print np.dot(a,b)
    #  [[ 30  36  42]
        [ 66  81  96]
        [102 126 150]]
    

    和矩阵乘法一样,更简洁地说:

    def mult(mtx_a,mtx_b):
        tpos_b = zip( *mtx_b)
        rtn = [[ sum( ea*eb for ea,eb in zip(a,b)) for b in tpos_b] for a in mtx_a]
        return rtn
    

    所以——问题可能出在您的输入数据上。

    【讨论】:

    • 是的,那是我的问题,你真的解释得很好谢谢!
    【解决方案3】:

    使用 numPy 库解决您的问题。

    将 numpy 导入为 np

    x = np.array(((2,3), (3, 5)))

    y = np.array(((1,2), (5, -1)) )

    打印 x * y

    数组([[ 2, 6], [15, -5]])

    更多示例: http://www.python-course.eu/matrix_arithmetic.php

    下载 numPy: http://scipy.org/Download

    【讨论】:

    • 虽然numpy 绝对是生产代码的方式,但我很确定这是一个练习,所以直接去图书馆可能会破坏目的。此外,OP 正在执行矩阵乘法,而不是元素乘法,因此两个 ndarrays 上的 x*y 将不起作用。您需要使用 dotmatrix 类。
    • Mido 你需要去 numpy 网站下载 numpy 库。在您需要安装之后,现在您可以转到您的项目并进行导入。
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多