python怎么做多个矩阵,在python中添加两个矩阵

I'm trying to write a function that adds two matrices to pass the following doctests:

>>> 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]]

So I wrote a function:

def add(x, y):

return x + y

And then I wrote the following function:

def add_matrices(c, d):

for i in range(len(c)):

print map(add, c[i], d[i])

And I sort of get the right answer.

解决方案

Matrix library

You can use the numpy module, which has support for this.

>>> 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]])

Home-grown solution: heavyweight

Assuming you wanted to implement it yourself, you'd set up the following machinery, which would let you define arbitrary pairwise operations:

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

Now adding pairwise methods is as easy as pie:

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)

Example:

>>> 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]]

You can even add pairwise exponentiation, negation, binary operations, etc. I do not demonstrate it here, because it's probably best to leave * and ** for matrix multiplication and matrix exponentiation.

Home-grown solution: lightweight

If you just want a really simple way to map an operation over only two nested-list matrices, you can do this:

def listmatrixMap(f, *matrices):

return \

[

[

f(*values)

for c,values in enumerate(zip(*rows))

]

for r,rows in enumerate(zip(*matrices))

]

Demo:

>>> listmatrixMap(operator.add, a, b, c))

[[3, 4], [5, 6]]

With an additional if-else and keyword argument, you can use indices in your lambda. Below is an example of how to write a matrix row-order enumerate function. The if-else and keyword were omitted above for clarity.

>>> listmatrixMap(lambda val,r,c:((r,c),val), a, indices=True)

[[((0, 0), 1), ((0, 1), 2)], [((1, 0), 3), ((1, 1), 4)]]

edit

So we could write the above add_matrices function like so:

def add_matrices(a,b):

return listmatrixMap(add, a, b)

Demo:

>>> add_matrices(c, d)

[[11, 4], [12, 6], [15, 19]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值