微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果 matrix_a = [[a, b], [c, d]],并且 matrix_b = [[w, x], [y, z]] 计算 matrix_c = [[a*w + c*y, a*x + c*z], [b*w + d*y, b*x + d*z]] 在 Python 3 中?

如何解决如果 matrix_a = [[a, b], [c, d]],并且 matrix_b = [[w, x], [y, z]] 计算 matrix_c = [[a*w + c*y, a*x + c*z], [b*w + d*y, b*x + d*z]] 在 Python 3 中?

如果我有两个矩阵 matrix_a = [[a,b],[c,d]] 和 matrix_b = [[w,x],[y,z]] 并且我希望找到以下矩阵 matrix_c = [[aw + cy,ax + cz],[bw + dy,bx + d z]] 我怎么能这样做,不仅适用于这种情况,而且适用于任意大小的 matrix_a 和 matrix_b:
a) 最简单地只使用列表推导式
b) 最简单地使用一个函数,该函数将两个矩阵 matrix_a 和 matrix_b 作为输入,并返回 matrix_c
c) 和/或其他 Pythonic 方式?

以下代码是我目前的解决方案。

matrix_a = [[1,1],[2,1]]
matrix_b = [[25,1.5],[30,2.7]]

# so we should obtain matrix_c = [[85,6.9],[55,4.2]]

transposed_matrix_a =[list(i) for i in zip(*matrix_a)]

matrix_c = []
for i in range(len(matrix_a[0])):
    def matrix_element(function,number):
        return [function(number)*matrix_b[number][i] for i in range(len(
            matrix_b[0]))]
        
    def t_matrix_a_element(x):
        return transposed_matrix_a[i][x]

    c_vector = [matrix_element(t_matrix_a_element,i) for i in range(len(
        transposed_matrix_a[0]))]
    matrix_c.append([sum(i) for i in zip(*c_vector)])

print(matrix_c)

编辑: 明确地说,所需的计算是:
矩阵_c = [[aw + cy,bx + dz]]
matrix_c = [[1 x 25 + 2 x 30,1 x 1.5 + 2 x 2.7],[1 x 25 + 1 x 30,1 x 1.5 + 1 x 2.7]]
矩阵_c = [[85,4.2]]

而不是产品:
[[aw + by,ax + bz],[cw + dy,cx + d z]]

解决方法

对于非 numpy 试试这个: (相信它更 Pythonic ... ;-) - 比 numpy 版本)

def matrix_mul(A,B):
    zip_b = list(zip(*B))
    return [[sum(a * b for a,b in zip(row_a,col_b))
                 for col_b in zip_b]
            for row_a in A]

# one-liner
""" result = [[ sum(a*b for a,b in zip(X_row,Y_col))
                        for Y_col in zip(*Y)]
              for X_row in X]
                    
"""
,

对于 (c) 情况,您可以简单地使用 numpy 模块。

import numpy as np

a = np.array([[1,1],[2,1]])
b = np.array([[25,1.5],[30,2.7]])

print(a @ b)

[[55.,4.2],[80.,5.7]]
,

尝试以下操作:

Exception in thread "main" java.lang.IllegalStateException: No Method: <Call name="addBefore"><Arg name="addBefore" type="java.lang.String">org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Arg><Arg><Array type="java.lang.String"><Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item></Array></Arg></Call> on class org.eclipse.jetty.webapp.Configuration$ClassList
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:950)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:515)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:945)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:515)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:431)
    at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:364)
    at net.sourceforge.eclipsejetty.starter.jetty9.Jetty9LauncherMain.configure(Jetty9LauncherMain.java:85)
    at net.sourceforge.eclipsejetty.starter.common.AbstractJettyLauncherMain.configure(AbstractJettyLauncherMain.java:144)
    at net.sourceforge.eclipsejetty.starter.common.AbstractJettyLauncherMain.launch(AbstractJettyLauncherMain.java:75)
    at net.sourceforge.eclipsejetty.starter.jetty9.Jetty9LauncherMain.main(Jetty9LauncherMain.java:42)
Caused by: java.lang.NoSuchMethodException: addBefore
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:987)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:942)
    ... 9 more

另一种方式,虽然是手动的,不能自动化,但以防万一:

def transpose(matrix):
    # if you just want to iterate over the 
    # transposed matrix,you can just
    # return zip(*matrix)
    return list(map(list,zip(*matrix)))

matrix_c = []

for row_a in matrix_a:
    row_c= []
    for val_a,row_b in zip(row_a,transpose(matrix_b)):
        val_c = sum(val_a * val_b for val_b in row_b)
        row_c.append(val_c)
    matrix_c.append(row_c)

print(result)

# [[55,[110,4.2]]
,

该问题的另一种解决方案完全基于列表理解:

import numpy as np

#mat_a = [[1,1]]
#mat_b = [[25,2.7]]
mat_a = np.random.random((3,4))
mat_b = np.random.random((4,5))

def matMul(A,B):
    return [list(map(lambda x:sum([i*j for i,j in x]),[list(zip(row,col)) for row in A for col in [list(i) for i in zip(*B)]]))[s*len(B[0]):s*len(B[0])+len(B[0])] for s in range(len(A)) ]

print(mat_a @ mat_b)
for row in matMul(mat_a,mat_b):
    print(row)
,
matrix_a = [[a,b],[c,d]]
matrix_b = [[w,x],[y,z]]
matrix_c = [[aw + cy,ax + cz],[bw + dy,bx + dz]]

abcdwxyz 不是很有帮助,尤其是当有人想概括任务时,最好用索引重写,例如

A = [a b] = [A11 A12],B = [w x] = [B11 B12]
    [c d]   [A21 A22]        [y z]   [B21 B22]

C = [a*w+c*y  a*x+c*z] = [A11*B11+A21*B21  A11*B12+A21*B22]
    [b*w+d*y  b*x+d*z]   [A12*B11+A22*B21  A12*B12+A22*B22]

然后有任何机会进行观察

Cij
C11 = A11*B11+A21*B21 = Sum Ak_*Bk_ for k=1,2 and _ could be either i or j
C12 = A11*B12+A21*B22 = Sum Aki*Bkj for k=1,2
C21 = A12*B11+A22*B21 = Sum Aki*Bkj for k=1,2
C22 = A12*B12+A22*B22 = Sum Ak_*Bk_ for k=1,2
Cij = Sum Aki*Bkj

一些你可能知道的事情,但还是用那个 abcdwxyz 的怪物把我们的眼睛挖出来了。

这是一个矩阵乘法,不是简单的A*B,而是AT*B
然后你可以从 Matrix Multiplication in pure Python? 中获取一个乘法代码,然后写

matrix_a = [[1,1]]
#matrix_a = [[1,2],[3,4]]
matrix_b = [[25,2.7]]

transposed_matrix_a =[list(i) for i in zip(*matrix_a)]
transposed_matrix_b =[list(i) for i in zip(*matrix_b)]

print([[sum(ele_a*ele_b for ele_a,ele_b in zip(row_a,col_b)) 
        for col_b in transposed_matrix_b] for row_a in transposed_matrix_a])

a,b,c,d=sum(matrix_a,[])
w,x,y,z=sum(matrix_b,[])
print(a*w+c*y,a*x+c*z)
print(b*w+d*y,b*x+d*z)

会产生

[[85,6.9],[55,4.2]]
85 6.9
55 4.2

(注释的 1,2,3,4 矩阵用于验证目的,因为原始矩阵内部有很多 1,某些索引问题可能会被忽视)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?