处理无穷大和NaN

有时候我们面对的浮点数是无穷大,负无穷大或者NaN(根本不是一个数),并且我们需要对它们进行判断测试

在Python中实际上并没有这样特殊的语法来表示这些特殊的浮点数值,但是我们可以使用float()函数来创建:

>>> a = float('inf')

>>> b = float('-inf')

>>> c = float('nan')

>>> a

inf

>>> b

-inf

>>> c

nan

>>>

如果你想要检测是否出现了这些值,我们可以用math.isinf()和math.isnan()函数来进行检查。如果需要获得有关于这些浮点数值的详细信息,可以参考一下IEEE 754规范:IEEE 754 - Wikipedia​en.wikipedia.org

有时候,无穷大值会在数学计算中传播:

>>> a = float('inf')

>>> a + 45

inf

>>> a * 100

inf

>>> 1000 / a

0.0

>>>

但是,有些特定的操作可能会导致未定义行为并产生NaN结果:

>>> a = float('inf')

>>> a/a

nan

>>> b = float('-inf')

>>> a + b

nan

>>>

并且,NaN会通过所有的操作进行传播,并且不会引发异常。并且,它有一个很有意思的特性就是它们在做比较的时候从来不会被判定为相等,正因为如此,唯一安全的检测NaN的方式就是使用函数math.isnan().相关程序代码如下:

def inf_nan():

a = float('inf')

b = float('-inf')

c = float('nan')

print(a + 45)

print(a + 45 == a)

print(a * 10 == a)

print(10 / a)

# undifined

print(a / a)

print(a + b)

print(c + 23)

print(c / 2 == c) # False ?

if __name__ == '__main__':

inf_nan()

有关于分数的计算

使用fractions模块可以用来解决涉及分数计算的问题:

from fractions import Fraction

def frac():

a = Fraction(5, 4)

b = Fraction(7, 16)

print(print(a + b))

print(a.numerator, a.denominator)

c = a + b

print(float(c))

print(type(c.limit_denominator(8)))

print(c.limit_denominator(8))

if __name__ == '__main__':

frac()

在命令行下是这个样子的:

>>> from fractions import Fraction

>>> a = Fraction(5, 4)

>>> b = Fraction(7,16)

>>> print(a+b)

27/16

>>> print(a * b)

35/64

#获取分子和分母

>>> c = a * b

>>> c.numerator

35

>>> c.denominator

64

#转换成浮点数

>>> float(c)

0.546875

#限制分母的值

>>> print(c.limit_denominator(8))

4/7

#转成分数

>>> x = 3.75

>>> y = Fraction(*x.as_integer_ratio())

>>> y

Fraction(15, 4)

>>>

处理大型数组的计算

有时候我们需要对大型的数据集进行计算,NumPy库是最好的选择,它的主要特性就是为Python提供了一个数组对象,咱举个例子:

#使用一般数组

>>> x = [1, 2, 3, 4]

>>> y = [5, 6, 7, 8]

>>> x * 2

[1, 2, 3, 4, 1, 2, 3, 4]

>>> x + 10

Traceback (most recent call last):

File "", line 1, in

TypeError: can only concatenate list (not "int") to list

>>> x + y

[1, 2, 3, 4, 5, 6, 7, 8]

#使用numpy

>>> import numpy as np

>>> ax = np.array([1, 2, 3, 4])

>>> ay = np.array([5, 6, 7, 8])

>>> ax * 2

array([2, 4, 6, 8])

>>> ax + 10

array([11, 12, 13, 14])

>>> ax + ay

array([ 6, 8, 10, 12])

>>> ax * ay

array([ 5, 12, 21, 32])

>>>

发现没有?有关数组的几个基本数学运算在行为上都有所不同,特别是numpy在进行标量运算的时候就是针对逐个元素进行计算的,并且,当两个元素都是数组的时候,Numpy数组会针对数组的所有元素进行计算,并产生出新的数组作为结果。此外,Numpy也提供了一些“通用函数”的集合,它们也可以对数组进行操作,它们都是通过math模块里的对应函数所替代的。比如我们想创建一个1000 x 1000的二位浮点数组

>>> grid = np.zeros(shape=(1000,1000), dtype=float)

>>> grid

array([[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

...,

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.]])

>>> grid += 10

>>> grid

array([[10., 10., 10., ..., 10., 10., 10.],

[10., 10., 10., ..., 10., 10., 10.],

[10., 10., 10., ..., 10., 10., 10.],

...,

[10., 10., 10., ..., 10., 10., 10.],

[10., 10., 10., ..., 10., 10., 10.],

[10., 10., 10., ..., 10., 10., 10.]])

>>> np.sin(grid)

array([[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,

-0.54402111, -0.54402111],

[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,

-0.54402111, -0.54402111],

[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,

-0.54402111, -0.54402111],

...,

[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,

-0.54402111, -0.54402111],

[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,

-0.54402111, -0.54402111],

[-0.54402111, -0.54402111, -0.54402111, ..., -0.54402111,

-0.54402111, -0.54402111]])

>>>

在IDE上是这个样子的:

import numpy as np

def array_numpy():

x = [1, 2, 3, 4]

y = [5, 6, 7, 8]

print(x * 2)

print(x + y)

# Numpy arrays

ax = np.array([1, 2, 3, 4])

ay = np.array([5, 6, 7, 8])

print(ax * 2)

print(ax + ay)

print(ax * ay)

print(f(ax))

print(np.sqrt(ax))

print(np.cos(ax))

# 大数组

grid = np.zeros(shape=(10000, 10000), dtype=float)

grid += 10

print(grid)

print(np.sin(grid))

# 二维数组的索引操作

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

print(a)

print(a[1]) # Select row 1

print(a[:, 1]) # Select column 1

# Select a subregion and change it

print(a[1:3, 1:3])

a[1:3, 1:3] += 10

print(a)

# Broadcast a row vector across an operation on all rows

print(a + [100, 101, 102, 103])

# Conditional assignment on an array

print(np.where(a < 10, a, 10))

def f(x):

return 3 * x ** 2 - 2 * x + 7

if __name__ == '__main__':

array_numpy()

参考书目:

《Python CookBook》作者:【美】 David Beazley, Brian K. Jones

Github地址:yidao620c/python3-cookbook​github.com

python3日期时间运算_马克的Python学习笔记#数字,日期和时间3相关推荐

  1. python 取整_马克的Python学习笔记#数字,日期和时间

    对数值进行调整 在Python中对整数和浮点数进行数字计算是很容易的.但是,如果你需要对分数,数组或者日期和时间进行计算,这就会稍微复杂点.对于简单的取整操作,我们可以使用内建的round(value ...

  2. py导入包异常跳出_马克的Python学习笔记#模块和包

    把模块按层次结构组织成包 模块和包是任何大型项目的核心,就连Python安装程序它本身也是一个包.创建一个软件包结构是非常简单的,我们只要把代码按照我们所希望的方式在文件系统上进行组织并且确保每个目录 ...

  3. python dd 合并二进制文件_马克的Python学习笔记#数据编码与处理 5

    读写二进制结构的数组 一般情况下来说,我们可以使用struct模块,比如我们可以像这样将一列Python元组写入到一个二进制文件之中,通过struct模块将每个元组编码为一个结构. from 当然,如 ...

  4. python基础论文_北大博士Python学习笔记,Python基础语法总结,一篇文章带你入门...

    image.png 网上现在Python学习资料有很多,但是很杂.很多初学Python的朋友就不知道该怎么去抉择,那些是自己当下所需要的. 刚好朋友是北大的博士,在IT行业也工作八年了.就把他学习Py ...

  5. 找一个网页,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间、名称和地点——python学习笔记

    1. 题目: 找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议 ...

  6. 扇贝编程python无法退款_扇贝编程python学习笔记-基础篇1

    我要成为一个勤奋努力上进的人 第一关 学习用时:15min 随堂测验+上机作业:10min 随堂作业正确率:4/5 1.尝试执行代码 import random menu = ['粉丝', '炒饭', ...

  7. 语言运算顺序题目_我的Python学习笔记:今天我学了关于Python里的运算符及运算顺序...

    2020年5月6日,天气晴 今天出奇的热,有33摄氏度这样子.我在昨天的基础上学习了有关于Python运算符及其运算顺序的相关知识.我的学习速度没有加快,就是为了能够多加深入地云掌握这些基础知识,也不 ...

  8. Python 十六进制转Base64_马克的Python学习笔记#数据编码与处理 4

    同关系型数据库进行交互 在Python中,表达行数据的表尊方式就是采用元组序列.当数据以这种形式呈现的时候,通过Python标准API来同关系型数据库进行交互相对来说就显得很直接了.这个API的要点就 ...

  9. 大智慧数据文件python_马克的Python学习笔记#模块和包 3

    让目录或者zip文件成为可以运行的脚本 我们的程序已经从一个简单的脚本进化为一个涉及多个文件的应用.我们希望能有某种简单的方式来让用户运行这个程序 如果应用程序已经进化为由多个文件组成的"庞 ...

  10. python 私有变量怎么调用_我的Python学习笔记(三):私有变量

    一.私有变量的定义 在Python中,有以下几种方式来定义变量: xx:公有变量 _xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入 ...

最新文章

  1. mysql 密码清楚_mysql 密码清除
  2. linux获取最高权限并取消_通过安卓渗透WIN7获取系统最高权限
  3. Node.js的环境搭建
  4. 大院大所合作对接会7天倒计时!亮点抢先看
  5. Linux解析内核源代码——传输控制块诞生
  6. SAP License:CO-FI实时集成
  7. java 线程等待_代码分析Java中线程的等待与唤醒
  8. 从0开始python后端开发_配置apache服务器(Mac系统)
  9. JavaScript 深入理解作用域
  10. 白板推导系列Pytorch-隐马尔可夫模型-解码问题
  11. Atitit.atiagent  agent分销系统 代理系统 设计文档
  12. JVM基础学习之基本概念、可见性与同步
  13. python一百行代码的项目_用python一百行代码实现xss扫描工具
  14. java 正则表达式 html,java正则表达式语法大全
  15. 等保2.0三级物联网安全扩展要求
  16. 初探Linux--鸟哥私房菜读书笔记
  17. web项目登录报错:HTTP Status 500 - Error instantiating servlet class com.gxuwz.medical.web.servlet.LoginSer
  18. 数据湖架构Hudi(五)Hudi集成Flink案例详解
  19. ODOO实现微信单点登入
  20. 2022-0828-0640,中文分词,逆向最大匹配算法 RMM

热门文章

  1. c语言学习笔记(持续更新中)
  2. 【英语】December
  3. redis知识盘点【陆】_客户端Jedis
  4. 苹果奖学金获得者:我的自学 iOS 开发历程
  5. 【软件需求工程】北理的恶龙们04——项目成果总结
  6. vscode 如何快速跳出括号
  7. 解决nf_conntrack: table full, dropping packet
  8. python回复qq_「转」使用python发送qq消息
  9. ECSHOP漏洞集:http://sebug.net/appdir/ECSHOP
  10. 斯蒂文斯理工学院计算机专业应聘,斯蒂文斯理工学院回国认可度高不高