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字符串匹配dp_[OI]字符串DP小结

顾名又思义,是在字符串上进行的DP操作。因为字符串本身可以看作是一个序列,所以有些时候字符串DP可以用区间DP来解决。P2246 SAC#1 - Hello World(升级版)题目描述在讲义的某一面,他看见了一篇文章。这篇文章由英文字母(大小写均有)、数字、和…

python打包成exe导入文件_【转载】将python脚本打包成exe文件

标签:exe文件也就是可以直接执行的文件。通常我们编好的带py后缀的脚本文件都是需要在有python的环境下执行,每次通过Win R打开运行窗口再输入powershell打开控制台,再千辛万苦地cd c:\python27 (change directory)转换目录到py文件的目录下。最终还是要…

java线上问题定位_java定位线上问题

3、jstack: Java 提供的命令。可以查看某个进程的当前线程栈运行情况。根据 这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及 是否死锁等等......A、//int a,b,c B、/** int a,b ,c */ C、{int a,b,c} */ D、/* int a,b String a */ 30、Java 目前支持…

python排名上升_TIOBE:2019年7月全球编程语言排行 Python热度继续上升

与上个月相比,Python 的指数又增加了不少,由 8.530% 上升到 9.260%。我们还留意到,TIOBE 对这期榜单的标题描述是“Perl is one of the victims of Python’s hype”,大意是说Perl 成为了过度炒作 Python 的受害者之一。TIOBE 认为…

java界面化二叉排序树_105-线索化二叉树代码实现2

2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上…

python截图识别文字代码_10几行代码,用python打造实时截图识别OCR

你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率。今天,我们就来做一款实时截图识别的小工具。顾名思义,运行程序时,可以实时的把你截出来的图片中的文字识别出来。、!下次&…

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

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

python数据拟合固定参数_如何将数据拟合到非理想二极管方程(隐式非线性函数)并检索参数 - python...

散乱数据图我需要将(x,y)-数据拟合到具有两个变量(x和y)的方程式中,并检索5个未知参数。我正在编写一个脚本,以处理来自简单.txt文件的IV数据(电流电压),并将其拟合为称为非理想二极管方程的方程;这是一个隐式非线性函…

java学生签到系统视频教程_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...

四个阶段的Java web学生信息系统视频教程终于录制完成了,系统用到的知识点有:jspservletmysqljqueryajax,前端采用的是当下最流行的easyui管理框架,全部采用面向接口的MVC三层设计模式,是大家学习Java web实战项目不可…

python做网络的仿真_用python自动化仿真HFSS,超简易

python是一款适用性极强的编程语言。一直期待HFSS(三维全波电磁场仿真的行业标准)能有python接口。后知后觉的本人才发现原来HFSS16(2015版本)已经不止支持VB脚本,还增加了python支持,当然它用的是Ironpython,基于.NET,和Cpython还…

为什么网格布局不显示java_java – 在GridLayout中不显示组件的FlowLayout?

我正在创建一个应用程序,作为某种类型的中心,用户可以将快捷方式存储到他们喜欢的应用程序并轻松启动它们.不过,我在使用FlowLayout时遇到了一些问题.当我使用GridLayout时,组件显示完美.当我使用FlowLayout时,根本没有任何显示.网格布局:FlowLayout中:我…

python爬取qq音乐歌词风变编程_爬取QQ音乐歌词

#!/usr/bin/env python3# -*- coding: utf-8 -*-# DESC: 爬取歌手前3页歌曲的歌词都爬取下来,并按歌名分别保存# Date: 2020-05-21import requestsimport re,osos.makedirs(music,exist_okTrue)## 添加请求头headers {user-agent:Mozilla/5.0 (Windows …

php post请求后端拿不到值_Ajax 提交POST后,后台php 无法获取$POST值

当 contentType 为 application/x-www-form-urlencoded 时(默认值)才能用 $_POST 得到传入的数据。但是使用 application/json;charsetutf-8不是 php 所能识别的类型声明,不能替你解析。所以只能用 php://input 取得,并用 parse_str 自行解析而形如 a1&a…

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

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

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

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

python os.environ windows_python 获取系统环境变量 os.environ and os.putenv

从一段code说起 “if "BATCH_CONFIG_INI" in os.environ:” 判断环境变量的值有没有定义如果定义的话就去环境变量的值,否则就取当前目录下的config.ini文件。if "BATCH_CONFIG_INI" in os.environ:print "Using custom ini file!"se…

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

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

python selenium截图_python+selenium截图操作样例

# -*- coding:utf-8 -*-# explain : 截图操作import os, timeclass Picture:"""截图操作分为正常的操作截图truepicture和异常的操作截图errorpicture"""def __init__(self, driver, path):""":type driver: selenium.webdriver.…

java环形队列测试,JAVA数据结构之循环队列的实现

1、循环队列CircleQueue类的实现代码如下所示:public class CircleQueue {private Object[] array;private int capacity;//队列容量private int count;//队列中元素的个数private int front;private int rear;public CircleQueue(int capacity){this.capacity cap…

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

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