python 数组赋值_pythonamp;numpy的赋值

有点编程基础的童鞋看到这个标题可能会有点懵逼,这还是个问题吗?不就是个等号(=)解决问题嘛!我也希望是如此简单,因为上个星期被这个问题折磨到崩溃!

一般的python程序需要赋值时的确是通过等号(=)实现的,不管是变量还是数组,例如:

i=1

pi=3.1415926

x=numpy.arange(1,10)

也可以实现一些稍微复杂的操作:

ilon=90

jlat=40

corr = Corr_piont_and_plane( djf[:,jlat,ilon] , djf )

其中Corr_piont_and_plane是一个函数,有两个参数,djf是冬季距平(500hPa位势高度场),三维数组,函数实现的功能是选择其中一个点(参数1,一维数组)和这个冬季距平(参数2)求时间相关,返回一个二维的相关系数矩阵,表征相关系数的空间分布。研究气候的童鞋会经常用到这个函数,只不过参数1大概率是某个指数序列,参数2大概率是前冬海温距平。

如果这个Corr_piont_and_plane函数是python写的,以上的代码是没有问题的,返回的结果也是正确的。但如果玩了一点骚操作,Corr_piont_and_plane是由Fortran或者C写的,编译成python可调用的动态库(如果对这个骚操作感兴趣,可以点这里),那前面的代码就是个大坑,我在这个大坑里转了一个星期。我先直接给明确结论,这个代码应该怎么写,然后再解释为什么。正确的代码应该这么写:

ilon=90

jlat=40

point=djf[:,jlat,ilon].copy()

corr = Corr_piont_and_plane( point, djf )

这个就涉及到今天这个技术贴的主题,numpy的赋值,更加python或者numpy的说法是拷贝。等号(=)实现的是浅拷贝,而numpy.copy()实现的是深度拷贝。尽量用简单的语言进行解释:在一个python程序,新建一个numpy的array之后,内核会分配一组内存用来保存数据,但是怎么进行管理呢?内核认识这片内存的地址,但是这个地址保存着数据,数组的名字,比如djf,指向这个数组的首地址。打个比方,一个小区,有好几栋楼,每栋楼好几层,然后一梯两户或者一梯三户,每个房子对着一户人家,小区物业怎么管理呢,正常情况下是几栋几零几(地址)住着谁家(数据),然后邻居之间关系好,会拥有下一户业主家的秘钥(下一个数据的地址,至于下一户是楼上楼下,还是同层别的住户,甚至于别的楼同门牌号的业主,和内存优先机制有关,列优先还是行优先,不同语言不一样,就是看小区物业自己咋规定)。回归主题,当进行索引或者切片的时候,返回的其实是地址,不是数据,内核会访问内存地址获取数据。但是当切片出来一个数组,比如这个point,等于(=)相当于给这些数据打上标记,叫做引用,数据的内存地址没有变化,但是用深度拷贝,相对于创建一个新数组保存新的数据,内存地址发生变化了。下图是一个简单示例,b是a的浅拷贝,所以b就是a,但是c是a的深度拷贝,如果c不是a。还用小区做例子进行解释,就是有一栋楼的某一个扇面的下水道坏了,要进行处理。小区物业记下了这一个扇面属于哪一栋楼的哪个哪个扇面,安排维修师傅更换下水道,这属于浅拷贝,因为住户还都住在这里,当维修人员发现楼房年久失修,更换下水道也不管事,只能异地拆迁的时候,属于深度拷贝,因为住户换地方住了。

e277478854e24ae4787b55f794fbd030.png

再次回归主题,当所有的代码都是基于python编写,直接把切片后的数组当做参数进行传递没有任何问题,但是C-API接口进行传递时,就会存在问题,问题在于参数传递的是地址,到了Fortran编写的subroutine里,访问数组的首地址能够正确识别,但是后面的数据就错了,因为传递过来的地址Fortran不认识,可能原因这么几点,还需要进一步确认:1、通过接口传递切片数组时,抹掉了切片信息,子程序默认还是内存的下一个地址去读数据,更深层次的原因可能是python对变量进行了对象封装,叫做PyObject,2、python和C默认行优先,Fortran默认列优先,数据寻址找错了方向。基于这些原因,需要进行深度拷贝,重建参数数组的内存地址逻辑,再进行参数传递,才是正确的操作。

最后,对结论进行总结:python&numpy的赋值一般通过浅拷贝实现,即等于(=),也可以把切片数组作为参数进行传递,代码简洁,节省内存,当需要使用C-API接口传递参数,建议对参数使用深度拷贝赋值之后再进行参数传递。

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

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

相关文章

我的世界java 内存_我的世界如何分配内存

如果你在运行Minecraft时出现内存错误等问题,你可能需要给Minecraft分配更多内存来解决运行故障。如果你玩的是新版本的Minecraft,那么你可以从启动器里直接分配内存(RAM)。如果你使用的是旧版本,那么你需要创建一些文件来改变Minecraft内存使…

springbean的生命周期_spring bean生命周期(涵盖spring常用接口的载入)

spring bean生命周期流程图:​​​​其中包含了很多常用的接口,可以参考spring 常用接口;下面写个例子证明下:1.实现InitializingBean以及各个Aware接口public class UserB implements InitializingBean , BeanFactoryAware , Bea…

python中的索引从几开始计数_计算机为什么要从 0 开始计数?

作者:程序喵大人来源:程序喵大人大家好,我是猫哥!众所周知,计算机是从0开始计数,而不是我们平时常用的从1开始计数,但你有想过为什么吗?其实不是计算机从0开始计数而是多数编程语言中…

coreos 安装mysql_如何执行CoreOS Linux的裸机安装

本文将介绍如何在裸机服务器上加载CoreOs Linux。关于在计算机上安装CoreOS Linux的更多方法。在本文中,我们将首先启动一些Live Linux发行版。从USB或CDROM提取Fedora,然后使用CoreOS的安装脚本在给定的硬盘驱动器上执行实际的CoreOS Linux。您将需要什…

websocket 发送图片_基于WebSocket的web端IM即时通讯应用的开发

基于WebSocket的web端IM即时通讯应用的开发功能列表:1、Web端的IM即时通讯应用2、支持上线、下线、实时在线提醒3、单聊、群聊的建立4、普通文字、表情、图片的传输(子定义富文本)5、单人的顶级提醒,多对话的窗口的提醒6、调用图灵机器人的自动回复演示目…

PHP定时抽奖怎么实现的,PHP 实现抽奖逻辑

public static function get_rand($proArr) {$result "";//概率数组的总概率精度$proSum array_sum($proArr);//概率数组循环foreach ($proArr as $key > $proCur) {$randNum mt_rand(1, $proSum);if ($randNum < $proCur) {$result $key;break;} else {$p…

绿盟漏洞扫描_主机安全漏洞解决方案

前几天发了一篇等保2.0的文章(等保2.0简单介绍 )&#xff0c;文章里面提到&#xff0c;相比于等保1.0标准&#xff0c;等保2.0很大幅度上对安全通用要求的一些控制项做了大幅精简&#xff0c;但是等保二级的要求仍多达135项、等保三级多达211项。https://mp.weixin.qq.com/s/kE…

采用光线跟踪绘制场景 c++_光线追踪的相干性聚集:硬件光线追踪的优势

尽管在理论上实现现代GPU的方法是无限的&#xff0c;但真正有效的方法是切实地了解问题并着手将方案变为现实。制造现代高性能半导体器件以及试图加速当前可编程光栅化技术所面临的问题揭示了GPU硬件行业发展的未来趋势。例如在现代GPU中SIMD处理和固定功能纹理单元是必不可少的…

xxljob 配置具体定时任务_分布式任务调度: XXL-Job

1 任务调度中心搭建、部署、任务管理与监控[1]任务调度中心页面2 SpringBoot 集成 xxl-job&#xff1a;创建调度任务maven项目pom.xml引入依赖:<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

前端白屏问题_深入理解前端性能监控

在同样的网络环境下&#xff0c;有两个同样能满足你的需求的网站&#xff0c;一个唰的一下就加载出来了&#xff0c;另一个白屏转圈转了半天内容才出来&#xff0c;如果让你选择&#xff0c;你会用哪一个&#xff1f;页面的性能问题是前端开发中一个重要环节&#xff0c;但一直…

信号的采样与恢复matlab实验报告,实验七 连续信号的采样与恢复

一、实验目的通过MATLAB仿真验证抽样定理&#xff0c;进一步加深对抽样定理的理解。二、实验原理1. 连续信号的采样对某一连续时间信号f(t)的采样原理图为&#xff1a;由图可知&#xff0c;&#xff0c;其中&#xff0c;单位冲激采样信号的表达式为&#xff1a; 其傅里叶变换为…

treegrid 如何获取getchanges inserted_如何避开Vue性能优化之路的荆棘?

随着这几年前端技术快速发展&#xff0c;Vue框架在国内普及率极高&#xff0c;人人都会用&#xff0c;那Vue如何写得比别人优雅&#xff1f;如何写得比别人漂亮&#xff1f;鉴于一线互联网大厂在前沿技术领域的持续研究和大规模投入&#xff0c;直接向他们取经&#xff0c;是最…

matlab+信号+mpf,Python和Matlab中平均频率的差异

我有这个EMG signal&#xff0c;我想根据这个article绘制平均功率频率。我使用以下代码在Matlab中实现它&#xff1a;clear all;close all;EMGload(EMG.txt);N1000; %my windowz1;fs200 %sampling ratefor i1:length(EMG)-NDUM0;NUM0;FTfft(EMG(i:iN-1));psdFT.*conj(FT);NFFTl…

matlab和vlfeat关联,VLFeat在matlab和vs中安装

转&#xff1a;http://blog.csdn.net/u011718701/article/details/51452011博主最近用vlfeat库做课题&#xff0c;网上搜索使用方法&#xff0c;一大片都会告诉你说&#xff1a;run(/vl_setup) 然后就好啦哈哈哈哈哈哈~~~~~~~~~~~~~~But!理想很丰满&#xff0c;现实很骨感&…

document.createelement如何绑定点击事件_番外篇-EXCEL如何使用宏(VBA)

小编&#xff0c;会在后续推送一些关于VBA(宏)相关的文章(之前其实也推送了一些&#xff0c;其中也大概说了一下如何使用)&#xff0c;所以我们今天就专门写一篇如何使用宏&#xff0c;方便大家使用已经写好的宏。如何使用宏&#xff1a;常规宏VBA-一般都是此类1、调出-开发工具…

局域网打印机反应慢_为什么你的Excel这么慢,这些原因必须要知道!

Excel是很多人的高频办公工具&#xff0c;但大家或多或少地遇到过&#xff0c;有时自己电脑的Excel很慢&#xff0c;导致工作的效率不高&#xff0c;可能就会导致要加班加点&#xff0c;也压缩了自己其他方面的时间。本文将介绍一些常见的Excel”慢“的情况及其解决方案&#x…

linux挂载fc存储有超级坏块_Nand Flash基础知识与坏块管理机制的研究

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群概述Flash名称的由来&#xff0c;Flash的擦除操作是以block块为单位的&#xff0c;与此相对应的是其他很多存储设备&#xff0c;是以bit位为最小读取/写入的单位&#xff0c;Flash是一…

carsim中质心加速度_振动CAE分析在空调压缩机支架设计中的应用

【摘要】本文运用有限元分析方法分析空调压缩机系统模态&#xff0c;并通过分析引起振动的激励源&#xff0c;找出压缩机支架和安装螺栓断裂的根本原因&#xff0c;并根据分析提出了解决措施。关键词&#xff1a;空调压缩机支架模态激励共振一、引言发动机轮系需要驱动的工作部…

linux下usb驱动配置文件,Linux环境下USB的原理、驱动和配置

随着生活水平的提高&#xff0c;人们对USB设备的使用也越来越多&#xff0c;鉴于Linux在硬件配置上尚不能全部即插即用&#xff0c;因此关于Linux如何配置和使用&#xff0c;成为困扰我们的一大问题。本文引用地址&#xff1a;http://www.eepw.com.cn/article/70029.htmlinux操…

linux 内核重定位,Linux 内核学习笔记:预备知识之“目标文件”

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;本文主要阐述 Linux 的目标文件(有可重定位目标文件、可执行目标文件和共享目标文件三种形式)&#xff0c;并把重点放在其格式和案例分析上。注&#xff1a;一般情…