python实现矩阵乘法

  • 不使用其他库的情况下实现矩阵乘法

不使用其他库的情况下实现矩阵乘法

在不使用numpy库的情况下实现矩阵乘法,看起来很简单,但这之中也是存在坑的。比如如下代码:

class mat_mul():def mm(self,A,B):row_len = len(A)column_len = len(B[0])cross_len = len(B)res_mat = [[0] * column_len] * row_len for i in range(row_len):for j in range(column_len):for k in range(cross_len):temp = A[i][k] * B[k][j]res_mat[i][j] += temp    print "==="print res_matdef main():A = [[1,1,1],[2,0,2]]B = [[0,1],[1,0],[1,1]]m = mat_mul()m.mm(A,B)
if __name__ == '__main__':main()

结果本应该是

可是最终程序运行完结果却是

最终将中间结果输出,发现问题出现在矩阵初始化阶段:

res_mat = [[0] * row_len] * column_len

这里我想初始化一个row_len*column_len的全0矩阵,所以[0]*row_len,再将新生成的list乘以coluimn_len。这里问题就出现了:
python中,如果将list 乘以k,表面上看起来是将list复制了k份,然而事实证明这k个list所指向的内存中的对象只有一个,即原始的list,也就是说如果其中一个list被改变,k个list都会跟着变。
举例:

c = [[0]*2]*2
print "before:",c
c[0][1] = 3
print "after:",c

最终输出结果:

可以看到我只给第0行的第一个元素赋值3,这却导致第1行的第一个元素跟着改变。
可以使用python的id函数查看每个列表的在内存内的地址:

print id(c[0]),id(c[1])
39642936 39642936

最终发现其地址是一样的。
所以,正确的初始化方法是:

res_mat = [[0] * row_len for i in range(column_len)]

这样最终的结果就没有问题啦。
原来一直以为了解python,但是对于其底层实现还掌握的太少太少。以后应该多注意这方面的学习。
PS:
列表的复制方法:

lista=[1,[2,3]]
listb=lista[:]
listb=[i for i in lista]
listb=copy.copy(lista)
listb=copy.deepcopy(lista)

只有第五种是完全拷贝,其他在不同场合下都会出现以上问题。

python实现矩阵乘法(不用numpy)相关推荐

  1. Python实现矩阵乘法

    问题 矩阵相信大家都知道,是线性代数中的知识,就是一系列数集.顾名思义,数字组成的矩形,例如: [1 2 3 4 5 67 8 9 1011 ] 现在,我们需要用python编程来实现矩阵的乘法. 输 ...

  2. python乘法模板_python – 使用矩阵乘法的numpy模板匹配

    我试图通过沿着图像移动模板来匹配模板与二进制图像(仅黑色和白色).并返回模板和图像之间的最小距离,以及发生此最小距离的相应位置.例如: IMG: 0 1 0 0 0 1 0 1 1 模板: 0 1 1 ...

  3. python和matlab矩阵运算效率_MATLAB矩阵乘法性能比NumPy快5倍

    我在MATLAB和Python中设置了两个关于广播矩阵乘法的相同测试.对于Python,我使用NumPy,对于MATLAB,我使用了使用BLAS的mtimesx库.在 MATLABclose all; ...

  4. 利用Python实现矩阵乘法并与numpy的结果比较

    文章目录 1.导入numpy库备用 2.生成两个随机矩阵 3.用`list` 实现矩阵相乘 4.直接采用`numpy`矩阵乘法 5.算法结果比较 6.结论 1.导入numpy库备用 import nu ...

  5. 用python实现矩阵乘法

    题目:只用python的类和列表,实现矩阵乘法. 分析:先给定用户输入,再实现乘法.若有矩阵a和b,axb的规则是a的每一行乘b的每一列,每一次都要求和. class Matmul(object):# ...

  6. python创建矩阵_python中Numpy的属性与创建矩阵

    本篇文章给大家带来的内容是关于python中Numpy的属性与创建矩阵,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. ndarray.ndim:维度 ndarray.shape:形状 ...

  7. python三维矩阵乘法_tensorflow 二维矩阵乘以三维矩阵,高维矩阵相乘

    最近看论文时看到了一个让我费解的操作. 二维矩阵 * 三维矩阵 * 二维矩阵 得到了一个二维矩阵. 即: (n * c1) x (m * c1 * c2) x (n * c2) 得 n * m 实现主 ...

  8. python 空矩阵_在NumPy中创建空数组/矩阵的方法

    如何在NumPy中创建空数组/矩阵? 在添加行的情况下,你最好的选择是创建一个与数据集最终一样大的数组,然后向它添加数据 row-by-row: >>> import numpy & ...

  9. 【Python】如何用 python 计算矩阵相乘 - numpy.dot()

    文章目录 一.如何用 python 计算矩阵乘法? 二.实例 参考链接 一.如何用 python 计算矩阵乘法? 使用 Numpy 包里的 dot() 函数. 该函数主要功能有两个:向量点积 和 矩阵 ...

  10. python矩阵乘法

    原理: python中矩阵乘法,可以通过 NumPy 的np.dot()函数计算(乘积也称为点积). np.dot()接收两个NumPy数组作为参数,并返回数组的乘积.类似于数学中的两个矩阵相乘,A中 ...

最新文章

  1. UI设计培训分享:UI设计师如何准备面试?
  2. 云计算机运行内存,电脑内存,云服务器内存最深刻的解读!
  3. webpack Entrypoint undefined = index.html
  4. python结巴分词 词频统计_一个txt文档,已经用结巴分词分完词,怎么用python工具对这个分完词的文档进行计算统计词频,求脚本,非...
  5. android studio修改包名
  6. 成功解决 \tensorflow\…\datasets\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.lea
  7. 03 | SRE切入点:选择SLI,设定SLO
  8. vue苹果浏览器微信公众号底部回退栏如何固定或隐藏
  9. leetcode题解104- 二叉树的最大深度
  10. Java学习笔记day08_day09_对象实例化_private_this
  11. table或者列表中超出的字用省略号代替的方法(支持IE6)
  12. 利用matlab绘制流场中的流线
  13. python练习-word操作(word字体替换)
  14. 51单片机的前世今世
  15. 计算广告中的名词解释
  16. 打印机扫描功能不见了_打印机扫描文件找不到路径怎么办?
  17. python下面代码是什么意思_python的入门,代码,什么意思?
  18. 互联网产品经理核心素质能力模型
  19. Matlab程序——3d玫瑰
  20. python函数(一)——def语句,作用域和参数

热门文章

  1. git中如何获取远程仓库的最新代码?
  2. 了解 云原生 和 边缘计算
  3. 前端工程师的前途与价值体现
  4. Android FFMPEG音视频开发(一)
  5. 多媒体视频技术:视频基础、视频格式、视频应用
  6. wifidog认证php,ddwrt+wifidog搭建热点认证系统(无线路由器web认证)
  7. KiCad坐标文件(.pos)转表格(.xlsx)工具
  8. 华三H3C路由器如何配置端口映射远程登录到内网服务器
  9. 国际短信通道短信后台软件路由流程—移讯云短信系统
  10. IT蚁族:蜗居和逃离