gpt4 book ai didi

python - 在python中添加两个矩阵

转载 作者:太空狗 更新时间:2023-10-29 17:23:45 25 4
gpt4 key购买 nike

我正在尝试编写一个将两个矩阵相加的函数以通过以下文档测试:

  >>> a = [[1, 2], [3, 4]]
>>> b = [[2, 2], [2, 2]]
>>> add_matrices(a, b)
[[3, 4], [5, 6]]
>>> c = [[8, 2], [3, 4], [5, 7]]
>>> d = [[3, 2], [9, 2], [10, 12]]
>>> add_matrices(c, d)
[[11, 4], [12, 6], [15, 19]]

所以我写了一个函数:

def add(x, y):
return x + y

然后我写了下面的函数:

def add_matrices(c, d):
for i in range(len(c)):
print map(add, c[i], d[i])

排序得到了正确的答案。

最佳答案

矩阵库

您可以使用支持此功能的 numpy 模块。

>>> import numpy as np

>>> a = np.matrix([[1, 2], [3, 4]])
>>> b = np.matrix([[2, 2], [2, 2]])

>>> a+b
matrix([[3, 4],
[5, 6]])

本土解决方案:重量级

假设您想自己实现它,您将设置以下机制,让您定义任意成对操作:

from pprint import pformat as pf

class Matrix(object):
def __init__(self, arrayOfRows=None, rows=None, cols=None):
if arrayOfRows:
self.data = arrayOfRows
else:
self.data = [[0 for c in range(cols)] for r in range(rows)]
self.rows = len(self.data)
self.cols = len(self.data[0])

@property
def shape(self): # myMatrix.shape -> (4,3)
return (self.rows, self.cols)
def __getitem__(self, i): # lets you do myMatrix[row][col
return self.data[i]
def __str__(self): # pretty string formatting
return pf(self.data)

@classmethod
def map(cls, func, *matrices):
assert len(set(m.shape for m in matrices))==1, 'Not all matrices same shape'

rows,cols = matrices[0].shape
new = Matrix(rows=rows, cols=cols)
for r in range(rows):
for c in range(cols):
new[r][c] = func(*[m[r][c] for m in matrices], r=r, c=c)
return new

现在添加成对方法就像做馅饼一样简单:

    def __add__(self, other):
return Matrix.map(lambda a,b,**kw:a+b, self, other)
def __sub__(self, other):
return Matrix.map(lambda a,b,**kw:a-b, self, other)

例子:

>>> a = Matrix([[1, 2], [3, 4]])
>>> b = Matrix([[2, 2], [2, 2]])
>>> b = Matrix([[0, 0], [0, 0]])

>>> print(a+b)
[[3, 4], [5, 6]]

>>> print(a-b)
[[-1, 0], [1, 2]]

您甚至可以添加成对求幂、取反、二元运算等。我在这里不演示,因为矩阵乘法和矩阵求幂最好保留 * 和 **。


本土解决方案:轻量级

如果您只是想要一种非常简单的方法来仅在两个嵌套列表矩阵上映射一个操作,您可以这样做:

def listmatrixMap(f, *matrices):
return \
[
[
f(*values)
for c,values in enumerate(zip(*rows))
]
for r,rows in enumerate(zip(*matrices))
]

演示:

>>> listmatrixMap(operator.add, a, b, c))
[[3, 4], [5, 6]]

通过额外的 if-else 和关键字参数,您可以在 lambda 中使用索引。下面是如何编写矩阵行顺序 enumerate 函数的示例。为清楚起见,上面省略了 if-else 和关键字。

>>> listmatrixMap(lambda val,r,c:((r,c),val), a, indices=True)
[[((0, 0), 1), ((0, 1), 2)], [((1, 0), 3), ((1, 1), 4)]]

编辑

所以我们可以像这样编写上面的 add_matrices 函数:

def add_matrices(a,b):
return listmatrixMap(add, a, b)

演示:

>>> add_matrices(c, d)
[[11, 4], [12, 6], [15, 19]]

关于python - 在python中添加两个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com