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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaSE练习题(一)

1、BMI是根据体重测量健康的方式。通过以千克为单位的体重除以以米为单位的身高的平方计算出BMI。下面是16 岁以上人群的BMI图表: 编写一个java程序,提示用户输人以磅为单位的体重和以英寸为单位的身高,然后显示BMI值。注意: 1磅是0.453592 37千克而1英寸…

【工具类】adb常用命令

1. adb常用命令 1. adb常用命令 1.1. 常用命令1.2. 命令解析1.3. 参考资料 为了描述方便,假设需要通过 adb 操作 android 系统,本机是 ubuntu 系统 1.1. 常用命令 上传下载,/data/log 目录是手机上的目录,~/Downloads/log 是…

9大变频电源模块的测试参数及其重要性

变频电源是将交流电经过交流-直流-交流变换,从而得到输出为正弦波的交流电,广泛应用于家电、电机、电脑设备、测试单位、航空等领域。变频电源测试是确保系统稳定运行的重要步骤。 变频电源测试的重要参数 1. 输出电压和电流 可用万用表、电流表或者示波…

解决 Jupyter Notebook 中没有显示想要的内核的问题

如果在 Jupyter Notebook 的 “Kernel” 菜单中没有显示你想要的内核(kernel),可能是因为该内核没有正确安装或配置到 Jupyter Notebook 中。在这种情况下,你可以尝试以下几个方法: 重新安装内核:首先&…

企业电脑如何管控(高效管控企业电脑的小技巧)

员工企业管理一直以来都是一个难题,难在人员多管理费劲。 因此高效管理一直都是企业最头疼的问题。 而使用一款软件辅助管理是很多企业发现的最有效的方法,如域智盾软件。 域智盾软件是一款专业的文件加密和数据安全软件,适用于各种企业和个…

C++异常处理

C异常处理 try和catch 在C中,try 是异常处理的关键字,用于定义一个代码块,该代码块中可能抛出异常。如果在 try 块中发生了异常,程序会立即停止当前块的执行,并查找与之匹配的 catch 块来处理异常。 下面是一个基本…

4.1 用源文件写汇编代码

汇编语言 1. 源程序 1.1 伪指令 汇编指令是有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行伪指令没有对应的机器指令,最终不被CPU所执行伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作 1.2…

【LeetCode每日一题】2312. 卖木头块(DFS记忆化搜索+动态规划)

文章目录 [2312. 卖木头块](https://leetcode.cn/problems/selling-pieces-of-wood/)思路1:用DFS进行记忆化搜索代码:思路2:动态规划代码: 2312. 卖木头块 思路1:用DFS进行记忆化搜索 1.要用DFS深度优先遍历每一种情况。在递归的同时,不断更…

【什么是Internet?网络边缘,网络核心,分组交换 vs 电路交换,接入网络和物理媒体】

文章目录 一、什么是Internet?1.从具体构成角度来看2.从服务角度来看 二、网络结构1.网络边缘1.网络边缘:采用网络设施的面向连接服务1.1.目标:在端系统之间传输数据1.2.TCP服务 2.网络边缘:采用网络设施的无连接服务2.1目标&…

unicloud快速上手,unicloud项目创建以及项目创建注意事项

uniCloud快速上手 本项目地址https://gitee.com/qayrup/unicloud-demo 创建unicloud项目 新建一个uni项目,并选择启用unicloud,选择阿里云或腾讯云 阿里云和支付宝云都支持一个月免费的云,如果只想体验啥的,可以选择这两个, 但是需要注意,支付宝云需要配置跨域,否则很多云函…

XCode升级错误:Command CompileC failed with a nonzero exit code 解决办法

升级完XCode之后,bulid失败,出现如下错误: 问题1: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrunCommand Compi…

网络编程面试题

一、什么是IP地址 1.IP地址是主机在网路中的唯一标识,,当主机从一个网络切换到另一个网络时,会更改IP地址,同样的IP地址也是路由器进行路由选择的标识 2.IP地址的分类 IPV4:采用4字节无符号整数存储 IPV6&#xff…

【JVM】垃圾收集算法,垃圾收集器,调优,如何判断类是无用的类?对象一定分配在堆中吗?了解逃逸分析技术吗?

目录 垃圾收集算法 标记-清除 标记-复制 标记-整理 分代收集算法 垃圾收集器 CMS收集器 G1 收集器 Serial收集器 ParNew收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel Old 收集器 引用类型总结 调优 调优命令 调优工具 调优参数 如何判断类是…

PPT好看配色

放几个链接!画图时候可以参考!转自知乎 Color Hunt ColorDrop 中国色 Flat UI Colors Coolors

Stable Diffusion之核心网络结构解析

Stable Diffusion核心网络结构解析 1. SD模型整体架构初识 1. SD模型整体架构初识 Stable Diffusion模型整体上是一个End-to-End模型,主要由以下三个核心组件构成。 VAE(变分自编码器,Variational Auto-Encoder),U-N…

Redis设计原理简介

键值存储模型: Redis是一个基于内存的键值对存储系统,它支持五种基本数据结构(字符串String、哈希Hash、列表List、集合Set、有序集合Sorted Set)以及几种高级数据结构如Bitmaps、HyperLogLogs等。 单线程架构: Redis采…

VMware部署银河麒麟遇到的问题记录

1. 解决VMware Workstation安装VMware Tools显示灰色的办法 1.关闭虚拟机; 2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤; 3.再重启虚拟机,灰色字即点亮。 2.Linux安装vmTool

【兆易创新GD32H759I-EVAL开发板】Keil 工程警告 Multiply defined Global Symbol 原因排查

在测试【兆易创新GD32H759I-EVAL开发板】过程中 遇到许多小坎坷 今天遇到的是 .\Objects\Project.axf: Warning: L6439W: Multiply defined Global Symbol OS_Tick_Enable defined in .text.OS_Tick_Enable(os_systick_1.o) rejected in favor of Symbol defined in .text.O…

最尴尬的论文!ChatGPT 抄来的忘记删掉提示词,211高校教授发表在一区SCI期刊

张同学,你的ChatGPT指令提示词忘记删除了?!!!! 近期,一篇题目为“The three-dimensional porous mesh structure of Cu-based metal-organic-framework - aramid cellulose separator enhances …

RISC-V架构中mret、sret、ret三个指令的区别

1、ret指令 ret用于函数调用时返回。可以把C语言函数反汇编,可以看到最后一句反汇编代码都是ret,对应于C语言的return语句执行ret函数后,会把PC设置成ra寄存器中保存的值,继续执行函数调用前的指令更多函数调用细节可参考博客&am…