python编写矩阵乘法函数_Python+MapReduce实现矩阵相乘算法原理
map阶段
在map阶段,需要做的是进⾏数据准备。把来⾃矩阵A的元素aij,标识成p条的形式,key="i,k",(其中k=1,2,...,p),value="a:j,aij";把来⾃矩阵B的元素bij,标识成m条形式,key="k,j"(其中k=1,2,...,m),value="b:i,bij"。
经过处理,⽤于计算cij需要的a、b就转变为有相同key("i,j")的数据对,通过value中"a:"、"b:"能区分元素是来⾃矩阵A还是矩阵B,以及具体的位置(在矩阵A的第⼏列,在矩阵B的第⼏⾏)。
shuffle阶段
这个阶段是Hadoop⾃动完成的阶段,具有相同key的value被分到同⼀个Iterable中,形成对,再传递给reduce。
reduce阶段
通过map数据预处理和shuffle数据分组两个阶段,reduce阶段只需要知道两件事就⾏:
对经过计算得到的是矩阵C的哪个元素?因为map阶段对数据的处理,key(i,j)中的数据对,就是其在矩阵C中的位置,第i⾏j列。
Iterable中的每个value来⾃于矩阵A和矩阵B的哪个位置?这个也在map阶段进⾏了标记,对于value(x:y,z),只需要到y相同的来⾃不同矩阵(即x分别为a和b)的两个元素,取z相乘,然后加和即可。
过程如下图所⽰:
算法实现
mapper.py
#!/usr/bin/env python3
import sys
flag = 0 # 0表⽰输⼊A、B矩阵信息,1表⽰处理A矩阵,2表⽰处理B矩阵
row_a, col_a, row_b, col_b = 0, 0, 0, 0 # A、B矩阵shape
current_row = 1 # 记录现在处理矩阵的第⼏⾏
def read_input():
for lines in sys.stdin:
yield lines
if __name__ == '__main__':
for line in read_input():
unt('\n') == len(line): # 去空⾏
pass
data = line.strip().split('\t')
if flag == 0:
flag = 1
row_a = int(data[0])
col_a = int(data[1])
row_b = int(data[2])
col_b = int(data[3])
if row_a == 0 or row_b == 0 or col_a == 0 or col_b ==0 or col_a != row_b: print("矩阵输⼊错误!")
break
elif flag == 1:
for i in range(col_b):
for j in range(col_a):
print("%s,%s\tA:%s,%s" % (current_row, i+1, j+1, data[j]))
current_row += 1
if current_row > row_a:
flag = 2
current_row = 1
elif flag == 2:
for i in range(row_a):
for j in range(col_b):
print("%s,%s\tB:%s,%s" % (i+1, j+1, current_row, data[j]))
current_row += 1
reducer.py
这是我⼀开始所写的版本。
#!/usr/bin/env python3
import sys
last, now = None, None
s = 0.0
count = 0
matrix_a, matrix_b = {}, {}
def read_input():
for lines in sys.stdin:
yield lines
if __name__ == '__main__':
for line in read_input():
unt('\n') == len(line): # 去空⾏
pass
data = line.strip().split('\t')
now = data[0]
if last is None:
last = now
count = 0
elif last != now:
for key in matrix_a:
s += float(matrix_a[key])*float(matrix_b[key])
print("%s\t%s" % (last, s))
s = 0.0
count = 0
last = now
value1 = data[1][0]
value2 = data[1].split(':')[1].split(',')[0]
value3 = data[1].split(',')[1]
if value1 == 'A':
count += 1
matrix_a[value2] = value3
else:
matrix_b[value2] = value3
for key in matrix_a:
s += float(matrix_a[key])*float(matrix_b[key])
print("%s\t%s" % (last, s))
后来借鉴参考了别⼈的代码后,学习了groupby,下⾯的代码就简洁多了。#!/usr/bin/env python3
import sys
from itertools import groupby
from operator import itemgetter
def read_input(splitstr):
for line in sys.stdin:
line = line.strip()
if len(line) == 0:
python新手代码useridcontinue
yield line.split(splitstr)
if __name__ == '__main__':
data = read_input('\t')
lstg = (groupby(data, itemgetter(0)))
try:
for flag, group in lstg:
matrix_a, matrix_b = {}, {}
total = 0.0
for element, g in group:
matrix = g.split(':')[0]
pos = g.split(':')[1].split(',')[0]
value = g.split(',')[1]
if matrix == 'A':
matrix_a[pos] = value
else:
matrix_b[pos] = value
for key in matrix_a:
total += float(matrix_a[key]) * float(matrix_b[key])
print("%s\t%s" % (flag, total))
except Exception:
pass
算法运⾏
执⾏结果为:
参考:
MapReduce实现矩阵相乘
矩阵相乘能够查看百度百科的解释baike.baidu/view/2455255.htm?fr=aladdin 有a和b两个矩阵 a:                1  2  ...
MapReduce的矩阵相乘
⼀.单个mapreduce的实现 转⾃:blog.sina/s/blog_62186b460101ai1x.html 王斌_ICTIR⽼师的
python版 mapreduce 矩阵相乘
参考张⽼师的mapreduce 矩阵相乘. 转载请注明:来⾃chybot的学习笔记iblogs/EditPosts.aspx?postid=4541939 下⾯是我⽤pyt ...
利⽤Hadoop实现超⼤矩阵相乘之我见(⼆)
前⽂ 在中我们所介绍的⽅法有着“计算过程中⽂件占⽤存储空间⼤”这个缺陷,本⽂中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘⽅法为 ...
利⽤Hadoop实现超⼤矩阵相乘之我见(⼀)
前记 最近,公司⼀位挺优秀的总务离职,欢送宴上,她对我说“你是⼀位挺优秀的程序员”,刚说完,⽴马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被⼈瞧不起的⼯作吗?或许 ...
Python numpy中矩阵的⽤法总结
关于Python Numpy库基础知识请参考博⽂:wwwblogs/wj-1314/p/9722794.html Python矩阵的基本⽤法 mat()函数将⽬标数据的类 ...
java 写⼀个 map reduce 矩阵相乘的案例
1.写⼀个⼯具类⽤来⽣成 map reduce 实验 所需 input ⽂件 下⾯两个是原始⽂件 1 2 -2 0 3 3 4 -3 -2 0 2 3 5 3 -1 2 -4 ...
关于python中的矩阵乘法(array和mat类型)
关于python中的矩阵乘法,我们⼀般有两种数据格式可以实现:np.array()类型和np.mat()类型: 对于这两种数据类型均有三种操作⽅式: (1)乘号 * (2)np.dot() (3)np ...
python数组和矩阵使⽤总结
python数组和矩阵使⽤总结 1.数组和矩阵常见⽤法 Python使⽤NumPy包完成了对N-维数组的快速便捷操作.使⽤这个包,需要导⼊numpy. SciPy包以NumPy包为基础,⼤⼤的扩展了n ...
随机推荐
OC单例快速实现
⾸先新建⼀个头⽂件,定义如下宏: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...
VS2008中调试dll
1.运⾏dll实例时,会直接弹出⼀个⼩框: 选择可拉起这个dll的exe运⾏就可以调试了
2.以后每次都会直接运⾏了,要重新选择程序,弹出上⾯的框,需要在project-->debugging- ...
ERP登录(⼋)
登录的存储过程: ALTER PROCEDURE [dbo].[UserLogin] @userid int output, @LoginName nvarchar(50), @Password nv ...
字符设备驱动: register_chrdev和register_chrdev_region
概述: register_chrdev与unregister_chrdev配对使⽤: /*register_chrdev = __register_chrdev_region (⼀次性256个⼦设备, ...
最短路模板[spfa][dijkstra+堆优化][floyd]
借bzoj1624练了⼀下模板(虽然正解只是floyd) spfa: #include #include #include
Linux常⽤命令详解(⼀) -- 处理⽬录常⽤命令
ls:列出⽬录    作⽤:查看linux⽂件夹包含的⽂件以及其权限(包括⽬录.⽂件夹.⽂件权限)和⽬录信息等    命令格式:ls [选项] [⽂件或⽬录]  选项或参数:            ...
第九篇 蓝图 blueprint
在Flask中的蓝图 blueprint 的作⽤就是将 功能 与 主服务 分开 ⽐如说,你有⼀个客户管理系统,最开始的时候,只有⼀个查看客户列表的功能,后来你⼜加⼊了⼀个添加客户的功能(add_use ...
10个免费的javascript富⽂本编辑器(jQuery and non-jQuery)
祝愿园⼦⾥的朋友圣诞节快乐. 本⽂介绍了10个免费易⽤富⽂本编辑器(rich text editors,RTE),其中5个是Jquery插件,另外5个是⾮Jquery 富⽂本编辑器 简介 Javascr ...
javaSE习题 第三章 运算符、表达式和语句
问答: 1.下列System.out.printf的结果是什么? int a=100,x,y; x=++a; y=a--; System.out.printf("%d,%d,%d" ...
我发起了⼀个 ⽤ C 语⾔ 作为 中间语⾔ 的 编译器 项⽬ VMBC

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。