首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python中赋值以及平均值计算的两个小坑

python中赋值以及平均值计算的两个小坑

作者头像
自学气象人
发布于 2022-10-09 02:00:16
发布于 2022-10-09 02:00:16
2.1K03
代码可运行
举报
文章被收录于专栏:自学气象人自学气象人
运行总次数:3
代码可运行

以下全文代码和数据均已发布至和鲸社区,复制下面链接或者阅读原文前往,可一键fork跑通:

https://www.heywhale.com/mw/project/62f9033c738412246370ef04

前不久在测试python代码的时候,我发现了两个不容易被人关注到的小坑(也有可能是我没注意到,哈哈哈)。这里给大家浅浅地分享一下,一起避雷了!

一、python中的“=”、“numpy.copy”、“copy.deepcopy”

这个是关于在python中赋值的小坑,给大家看看下面的几个例子,大家应该就明白了。

我们先来建立一个初始数组a,然后分别用这三种方法来进行赋值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import copy as cp

a = np.array([9,'自学气象人',[1,2,3],[997,998,999]])
b = a
c = np.copy(a)
d = cp.deepcopy(a)

print('a',a)
print('b',b)
print('c',c)
print('d',d)

现在,我们先来改变d中的三个元素的值,看看初始数组a会不会发生变化。可以看到,改变采用copy.deepcopy()方法赋值的d数组中的数值,完全不会影响到初始数组a的值。即copy.deepcopy()方法是深复制(完全的复制了)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('改变前的a',a)
print('改变前的d',d)
d[0] = -1
d[1] = '好好学习'
d[2] = ['天天向上']
d[3][1] = 1000
print('改变后的d',d)
print('改变后的a',a)

接着,我们再来改变c中的三个元素的值,看看初始数组a会不会发生变化。可以看到,改变采用numpy.copy()方法赋值的c数组中的数值,会部分影响到初始数组a中的值。这仅发生于我们改变初始数组a中的列表中的元素(改变整个列表则不会影响初始数组a),也即numpy.copy()方法无法复制其作用数组中所包含对象内的元素,属于浅复制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('改变前的a',a)
print('改变前的c',c)
c[0] = -1
c[1] = '好好学习'
c[2] = ['天天向上']
c[3][1] = 1000
print('改变后的c',c)
print('改变后的a',a)

最后,我们来看一下改变b中的三个元素的值,看看初始数组a会不会发生变化。可以看到,改变采用 “=” 方法赋值的b数组中的数值,会完全地影响到初始数组a中的值。即对b进行的操作会完全地同步到初始数组a上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('改变前的a',a)
print('改变前的b',b)
b[0] = -1
b[1] = '好好学习'
b[2] = ['天天向上']
b[3][1] = 1000
print('改变后的b',b)
print('改变后的a',a)

二、python中的“np.nanmean”、“xarray.mean”

这个呢,是python中求平均值的小坑(当计算的数据中存在nan值时会出现)。同样给大家看看下面几个例子,一起来具体地感受一下。

首先我们来创建个dataset,其中有一个nan值(缺省值)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xarray as xr 
import numpy as np
import pandas as pd

data = np.array([[1, np.nan,  2],
                 [3, 4, 5]])

da = xr.DataArray(
    data,
    [
        ("lat", np.array([10,11])),
        ("lon", np.array([1,2,3]))],
)


ds = da.to_dataset(name="temp")
ds['temp']

接着我们先来看一下正确计算的平均值是多少(也就是这五个数加起来的平均值)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1+2+3+4+5) / 5

当我们使用numpy.nanmean()方法计算时,可以看到是正确的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.nanmean(ds['temp'])

当我们使用xarray.mean()方法并同时输入两个维度“lat”“lon”计算时,可以看到是正确的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ds['temp'].mean(dim=['lat','lon'])

当我们使用xarray.mean()方法并先对维度“lon”计算平均,再对维度“lat”计算平均时,可以看到结果偏离了正确的均值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ds['temp'].mean(dim=['lon']).mean(dim=['lat'])

上面这种分步计算的方法等价于下面的计算。即由于存在nan值,所以计算时候分母发生了变化,导致分步计算的结果与正确计算结果之间出现偏差。如果没有nan值的话,这几种计算方法得到的结果就会一致。

大家也可以试试先计算“lat”再计算“lon”,结果也不会是3.0。这个问题在我们求区域平均时候要十分注意,切记检查是否有nan值,并据此选择合适的均值计算方法。

以上就是本文的全部内容。如有不妥之处,还望各位指正!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
easyui常用组件
表单 日期选择(html初始化) <input name="tadminModel.birthday" class="easyui-validatebox Wdate" style="width: 370px;" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',position:{right:0,top:0}})"/> 按钮(html初始化) <a type="button" href="javascript:;" class="easyui-linkbutton" i
码客说
2019/10/22
2.4K0
跨平台PHP调试器设计及使用方法——界面设计和实现
        一个优秀的交互设计往往会影响一个产品的命运。在设计这款调试器时,我一直在构思这款调试器该长什么样子。简单、好用是我设计的原则,于是在《跨平台PHP调试器设计及使用方法——立项》一文中,我给出了一个Demo。之后实现的效果也与之变化并不大。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
8210
easy ui Tree请求跨域数据
jQuery EasyUI为提供了大多数UI控件的使用,如:accordion,combobox,menu,dialog,tabs,validatebox,datagrid,window,tree等等。
寻找石头鱼
2019/09/11
7560
MVC5+EasyUI+EF6增删改查以及登录登出的演示
创建StudentController、 及Index视图, 在Index上按F5运行
明志德道
2023/10/21
3230
MVC5+EasyUI+EF6增删改查以及登录登出的演示
easyui+nodejs+sqlserver增删改查实现
用到的模块或者技术: Express: http://www.expressjs.com.cn/4x/api.html#express Easyui: http://www.jeasyui.com
用户1141560
2017/12/26
3.2K0
easyui+nodejs+sqlserver增删改查实现
下拉框、下拉控件之Select2。自动补全的使用
1、使用插件,首先要引入别人的插件了,你可以选择离线(无网络)或者在线引用的(如果有网络)。
别先生
2019/06/03
2.6K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧。 后台系统没有多大的UI视觉,这次我们采用的是标准的左右分栏,左边是系统菜单,右边是一个以tabs页组成的页面集合,每一个tab都可以单独刷新和关闭 开发工具 Visual Studio 2012(以上) 开始搭建 打开我们熟悉的VS创建一个空解决方案。我起了个名字叫Apps,类库命名空间将与Apps开头 如Apps.BLL,Apps.Web等命名 1. 新建MVC5.
用户1149182
2018/01/16
2.4K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
EasyUI初体验–右键弹框
在C/S中可能非常easy实现右键弹框,但在B/S中直到今天我才搞定,小小得瑟一下。只一个html页面,导入相关的Easy-UI类库就能搞定,Easy-UI类库下载地址
全栈程序员站长
2022/07/13
1.1K0
EasyUI初体验–右键弹框
第十八章 DjangoWeb开发框架
第十八章 DjangoWeb开发框架 第一课 内容概要: 1.JS正则 -登录注册验证 2.组件 1.BootStrap -css -js 学习BootStrap规则 2.jQueryUI -css -js 学习jQueryUI规则 3.EasyUI -css -js 学习EasyUI规则 3.Web框架 4.Django(python功能最齐全的Web框架) 第二课 JS正则 1.t
玩蛇的胖纸
2018/06/08
8680
easyui 布局_layout布局
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说easyui 布局_layout布局,希望能够帮助大家进步!!!
Java架构师必看
2022/07/25
2.3K0
easyui 布局_layout布局
用jQuery模拟select下拉框
很多时候,美工会觉得默认的select下拉框很难看(特别是右侧的下拉箭头按钮),他们通常喜欢用一个自定义的图标来代替这个按钮。这样就只能用 js + div 来模拟了,倒腾了一番,用jQuery模拟了下,当然网上这种文章也不少,只是懒得去看找,又重新发明轮子鸟:)
菩提树下的杨过
2019/09/12
4K0
初试JqueryEasyUI(附Demo)[通俗易懂]
  关于easyui不多说,对于我们这样没有美术功底的程序员来说,简直是大大的福利,园里面也有不少人在用,自己在整理一个个站,后台管理要用,正好可以学习下。网上找了相关的教程什么的,但是发现还是官网上的demo讲的狠详细,还有就是下载后的demo示例,但都是某个控件示例,很遗憾,没有整个系统的demo。
全栈程序员站长
2022/09/07
2K0
初试JqueryEasyUI(附Demo)[通俗易懂]
thinkjs crud练习
该文章介绍了一种使用 ES6 实现模板引擎,并使用 ThinkJS 引擎进行模板渲染的方法。该方法包括配置 ES6 环境、定义模板引擎接口、实现模板引擎基类、定义模板语法、实现模板编译和渲染、编写测试用例和代码示例。
用户1141560
2017/12/26
1.5K0
thinkjs crud练习
Web前端学习笔记之jQuery基础
维护IE678是一件让人头疼的事情,一般我们都会额外加载一个CSS和JS单独处理。值得庆幸的是使用这些浏览器的人也逐步减少,PC端用户已经逐步被移动端用户所取代,如果没有特殊要求的话,一般都会选择放弃对678的支持。
Jetpropelledsnake21
2019/02/15
3.7K0
jQuery EasyUI 详解
easyui 为创建现代化,互动,JavaScript 应用程序,提供必要的功能。
老马
2018/07/31
9.7K0
jQuery EasyUI 详解
jquery easyui菜单树显示
目前做了一个easyui项目需要显示多级菜单,菜单配置到数据库中,因此每级菜单都需要到数据库中取,用了jQuery EasyUI方便多了。
全栈程序员站长
2022/07/15
4K0
javaWeb核心技术第五篇之jQuery
- 概述 - jQuery是一个优秀的javascript框架(js类库),兼容css3和各大浏览器,提供dom,events,animate,ajax等简易的操作。并且jQuery有非常丰富的插件,大多数功能都有相应的插件解决方案。jQuery的宗旨是write less, do more. (写的更少,做的更多) - jQuery入门 - jQuery和html整合 - 下载 - 下载地址:www.jquery.com - 使用script的src属性即可
海仔
2019/08/26
8.4K0
04 . 前端之JQuery
JQuery简介 # 1. jQuery是一个轻量级的、兼容多浏览器的JavaScript库。 # 2. jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便
iginkgo18
2020/09/27
3.7K0
前端基础:jQuery
jQuery 能做的 JavaScript 也都能做,但使用 jQuery 能大幅提高开发效率
RendaZhang
2020/09/08
13.8K0
前端基础:jQuery
day41_jQuery学习笔记_02
下面是jQuery 提供额外的事件,用于完善javascript缺失的事件 详解如下:
黑泽君
2018/10/11
4K0
相关推荐
easyui常用组件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验