当前位置: 首页 > news >正文

python初始化二维数据

1.遇到的问题

突然不知道什么原因,想起来实现一个矩阵的乘法,于是用python代码实现一下。

def matrix_multiply():a = [[1, 2], [3, 4]]b = [[5, 6, 7], [8, 9, 10]]m, n = len(a[0]), len(b)if m != n:print('we need a column equal b row!')m, t = len(a), len(a[0])t, n = len(b), len(b[0])result = []inner = [0 for i in range(n)]for i in range(m):result.append(inner)for i in range(m):for j in range(n):for k in range(t):result[i][j] += a[i][k] * b[k][j]print(result)

初步看上去,代码逻辑比较简单,好像也没有任何问题,但是运行的输出结果为

[[68, 78, 88], [68, 78, 88]]

很明显结果不符合预期,肯定是哪个环节出现了问题,于是查找问题。
通过debug,发现result[0][0]-result[0][2]的范围,输出都正确,从result[1][0]开始输出结果有问题,于是大概就猜测到了问题在哪,应该是result初始化的时候出现了问题。

2.二维数组初始化方式1

为了验证猜测,进行了一些二维数组初始化的尝试。

比如下面这种方式

def init_array():a = [[0 for _ in range(5)] for _ in range(3)]print(a)a[0][0] = 1print(a)

通过双重列表推导的方式可以对二维数组实现初始化,最后输出为

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

上面这种初始化方式,对a[0][0]值进行修改的时候,a[1][0], a[2][0]的值未发生改变。

3.二维数组初始化方式2

def init_array_v2():a = [[0] * 5 for i in range(3)]print(a)a[0][0] = 1print(a)

这样也可以进行二维数组的初始化,输出结果与第一种方式相同。

4.二维数组初始化方式3

def init_array_v3():a = [[0] * 5] * 3print(a)a[0][0] = 1print(a)a[1][2] = 2print(a)

如果按上面这种方式进行初始化,输出结果为

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
[[1, 0, 2, 0, 0], [1, 0, 2, 0, 0], [1, 0, 2, 0, 0]]

很明显,对a[0][0]进行修改以后,a[1][0], a[2][0]的值也发生了改变。
为什么会这样?
因为[0] * 5是一个一维数组的对象,*3的操作,是将这个对象的引用复制了三次。将a[0][0]的值修改为1以后,a[1][0], a[2][0]的值也变为了1。

我们前面矩阵乘法的初始化方式也跟上面这种方式类似。

def init_array_v4():result = []inner = [0 for i in range(5)]for i in range(3):result.append(inner)print(result)result[0][0] = 1print(result)

输出结果为:

[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]

很明显result.append(inner)的时候,也是对象的引用。将result[0][0]进行修改以后,第0列的值都跟着发生变化。

5.正确的矩阵乘法实现

那么正确的矩阵乘法实现也很容易了

def matrix_multiply():a = [[1, 2], [3, 4]]b = [[5, 6, 7], [8, 9, 10]]m, n = len(a[0]), len(b)if m != n:print('we need a column equal b row!')m, t = len(a), len(a[0])t, n = len(b), len(b[0])result = [[0 for _ in range(n)] for _ in range(m)]for i in range(m):for j in range(n):for k in range(t):result[i][j] += a[i][k] * b[k][j]print(result)

相关文章:

  • 实体框架EF(Entity Framework)简介
  • linux之shell脚本基础
  • DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection
  • 无线局域网——wlan
  • 【Python 48小时速成 8】函数
  • Spring如何解决循环依赖?
  • macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
  • postgresql查看数据库占用空间大小
  • 《如何使用C语言去下三子棋?》
  • qt+ffmpeg 实现音视频播放(二)之音频播放
  • 【UE5】动画蒙太奇简述
  • K8S日志收集方案-EFK部署
  • 第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》
  • 流畅的 Python 第二版(GPT 重译)(六)
  • 如何与手机共享笔记本电脑的互联网?这里提供详细步骤
  • 深入了解以太坊
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【Linux系统编程】快速查找errno错误码信息
  • Apache的80端口被占用以及访问时报错403
  • bootstrap创建登录注册页面
  • co模块的前端实现
  • in typeof instanceof ===这些运算符有什么作用
  • Java 网络编程(2):UDP 的使用
  • Java到底能干嘛?
  • JS笔记四:作用域、变量(函数)提升
  • JS实现简单的MVC模式开发小游戏
  • mysql 5.6 原生Online DDL解析
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP 的 SAPI 是个什么东西
  • Promise初体验
  • springMvc学习笔记(2)
  • Spring框架之我见(三)——IOC、AOP
  • 从setTimeout-setInterval看JS线程
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 精彩代码 vue.js
  • 两列自适应布局方案整理
  • 前端技术周刊 2019-02-11 Serverless
  • 物联网链路协议
  • 怎么把视频里的音乐提取出来
  • 栈实现走出迷宫(C++)
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • FaaS 的简单实践
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #{}和${}的区别?
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm高校实验室 毕业设计 800008
  • (转)Linq学习笔记
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ..回顾17,展望18
  • .jks文件(JAVA KeyStore)
  • .net php 通信,flash与asp/php/asp.net通信的方法