python输入一个数组输出24进制式的时间_4.4 用于数组的文件输入输出 线性代数...

Numpy能够读写磁盘上的文本数据或二进制数据。这一小节只讨论Numpy的内置二进制格式,因为更多的用户会使用pandas或其它工具加载文本或表格数据(见第6章)。

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的:

In [213]: arr = np.arange(10)

In [214]: np.save('some_array', arr)

如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。然后就可以通过np.load读取磁盘上的数组:

In [215]: np.load('some_array.npy')

Out[215]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

通过np.savez可以将多个数组保存到一个未压缩文件中,将数组以关键字参数的形式传入即可:

In [216]: np.savez('array_archive.npz', a=arr, b=arr)

加载.npz文件时,你会得到一个类似字典的对象,该对象会对各个数组进行延迟加载:

In [217]: arch = np.load('array_archive.npz')

In [218]: arch['b']

Out[218]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如果要将数据压缩,可以使用numpy.savez_compressed:

In [219]: np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

线性代数

线性代数(如矩阵乘法、矩阵分解、行列以及其他方阵数学等)是任何数组库的重要组成部分。不像某些语言(如matlab),通过*对两个二维数组相乘得到的是一个元素级的积,而不是一个矩阵点积。因此,Numpy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间的一个函数):

In [223]: x = np.array([[1., 2., 3.], [4., 5., 6.]])

In [224]: y = np.array([[6., 23.], [-1, 7], [8, 9]])

In [225]: x

Out[225]:

array([[ 1., 2., 3.],

[ 4., 5., 6.]])

In [226]: y

Out[226]:

array([[ 6., 23.],

[ -1., 7.],

[ 8., 9.]])

In [227]: x.dot(y)

Out[227]:

array([[ 28., 64.],

[ 67., 181.]])

x.dot(y)等价于np.dot(x, y)

In [228]: np.dot(x, y)

Out[228]:

array([[ 28., 64.],

[ 67., 181.]])

一个二维数组跟一个大小合适的一维数组的矩阵点积运算之后将会得到一个一维数组:

In [229]: np.dot(x, np.ones(3))

Out[229]: array([ 6., 15.])

@符也可以用来用作运算符,进行矩阵乘法:

In [230]: x @ np.ones(3)

Out[230]: array([ 6., 15.])

numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。它们跟matlab和R等语言所使用的是相同的行业标准线性代数库,如BLAS、LAPACK、Intel MKL(Math Kernel Library,可能有,取决于你的NumPy版本)等:

In [231]: from numpy.linalg import inv, qr

In [232]: X = np.random.randn(5, 5)

In [233]: mat = X.T.dot(X)

In [234]: inv(mat)

Out[234]:

array([[ 933.1189, 871.8258, -1417.6902, -1460.4005, 1782.1391],

[ 871.8258, 815.3929, -1325.9965, -1365.9242, 1666.9347],

[-1417.6902, -1325.9965, 2158.4424, 2222.0191, -2711.6822],

[-1460.4005, -1365.9242, 2222.0191, 2289.0575, -2793.422 ],

[ 1782.1391, 1666.9347, -2711.6822, -2793.422 , 3409.5128]])

In [235]: mat.dot(inv(mat))

Out[235]:

array([[ 1., 0., -0., -0., -0.],

[-0., 1., 0., 0., 0.],

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

[-0., 0., 0., 1., -0.],

[-0., 0., 0., 0., 1.]])

In [236]: q, r = qr(mat)

In [237]: r

Out[237]:

array([[-1.6914, 4.38 , 0.1757, 0.4075, -0.7838],

[ 0. , -2.6436, 0.1939, -3.072 , -1.0702],

[ 0. , 0. , -0.8138, 1.5414, 0.6155],

[ 0. , 0. , 0. , -2.6445, -2.1669],

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

表达式X.T.dot(X)计算X和它的转置X.T的点积。

表4-7列出了一些最常用的线性代数函数:

伪随机数生成

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。例如,你可以用normal来得到一个标准正态分布的4×4样本数组:

In [238]: samples = np.random.normal(size=(4, 4))

In [239]: samples

Out[239]:

array([[ 0.5732, 0.1933, 0.4429, 1.2796],

[ 0.575 , 0.4339, -0.7658, -1.237 ],

[-0.5367, 1.8545, -0.92 , -0.1082],

[ 0.1525, 0.9435, -1.0953, -0.144 ]])

而Python内置的random模块则只能一次生成一个样本值。从下面的测试结果可以看出,如果需要产生大量样本值,numpy.random快了不止一个数量级:

In [240]: from random import normalvariate

In [241]: N = 1000000

In [242]: %timeit samples = [normalvariate(0, 1) for _ in range(N)]

1.77 s +- 126 ms per loop (mean +- std. dev. of 7 runs, 1 loop each)

In [243]: %timeit np.random.normal(size=N)

61.7 ms +- 1.32 ms per loop (mean +- std. dev. of 7 runs, 10 loops each)

我们说这些都是伪随机数,是因为它们都是通过算法基于随机数生成器种子,在确定性的条件下生成的。你可以用Numpy的np.random.seed更改随机数生成种子:

In [244]: np.random.seed(1234)

numpy.random的数据生成函数使用了全局的随机种子。要避免全局状态,你可以使用numpy.random.RandomState,创建一个与其它隔离的随机数生成器:

In [245]: rng = np.random.RandomState(1234)

In [246]: rng.randn(10)

Out[246]:

array([ 0.4714, -1.191 , 1.4327, -0.3127, -0.7206, 0.8872, 0.8596,

-0.6365, 0.0157, -2.2427])

表4-8列出了numpy.random中的部分函数。在下一节中,我将给出一些利用这些函数一次性生成大量样本值的范例。

示例:随机漫步

我们通过模拟随机漫步来说明如何运用数组运算,先来看一个简单的随机漫步的例子:从0开始,步长1和-1出现的概率相等。

下面是一个通过内置的random模块以纯Python的方式实现1000步的随机漫步:

In [247]: import random

.....: position = 0

.....: walk = [position]

.....: steps = 1000

.....: for i in range(steps):

.....: step = 1 if random.randint(0, 1) else -1

.....: position += step

.....: walk.append(position)

.....:

图4-4是根据前100个随机漫步值生成的折线图:

In [249]: plt.plot(walk[:100])

图4-4 简单的随机漫步.png

不难看出,这其实就是随机漫步中各步的累计和,可以用一个数组运算来实现。因此,我用np.random模块一次性随机产生1000个“掷硬币”结果(即两个数中任选一个),将其分别设置成1或-1,然后计算累计和:

In [251]: nsteps = 1000

In [252]: draws = np.random.randint(0, 2, size=nsteps)

In [253]: steps = np.where(draws > 0, 1, -1)

In [254]: walk = steps.cumsum()

有了这些数据之后,我们就可以沿着漫步路径做一些统计工作了,比如求取最大值和最小值:

In [255]: walk.min()

Out[255]: -3

In [256]: walk.max()

Out[256]: 31

现在来看一个复杂点的统计任务——首次穿越时间,即随机漫步过程中第一次到达某个特定值的时间。假设我们想要知道本次随机漫步需要多久才能举例初始0点至少10步远(任一方向均可)。np.abs(walk)>=10可以得到一个布尔型数组,它表示的是距离是否达到或超过10,而我们想要知道的是第一个10或-10的索引。可以用argmax来解决这个问题,它返回的是该布尔型数组第一个最大值的索引(True就是最大值):

In [257]: (np.abs(walk) >= 10).argmax()

Out[257]: 37

注意,这里使用argmax并不是很高效,因为它无论如何都会对数组进行完全扫描。在本例中,只要发现了一个True,那我们就知道它是个最大值了。

一次模拟多个随机漫步

如果你希望模拟多个随机漫步过程(比如5000个),只需对上面的代码做一点点修改即可生成所有的随机漫步过程。只要给numpy.random的函数传入一个二元元组就可以产生一个二维数组,然后我们就可以一次性计算5000个随机漫步过程(一行一个)的累计和了:

In [258]: nwalks = 5000

In [259]: nsteps = 1000

In [260]: draws = np.random.randint(0, 2, size=(nwalks, nsteps)) # 0 or 1

In [261]: steps = np.where(draws > 0, 1, -1)

In [262]: walks = steps.cumsum(1)

In [263]: walks

Out[263]:

array([[ 1, 0, 1, ..., 8, 7, 8],

[ 1, 0, -1, ..., 34, 33, 32],

[ 1, 0, -1, ..., 4, 5, 4],

...,

[ 1, 2, 1, ..., 24, 25, 26],

[ 1, 2, 3, ..., 14, 13, 14],

[ -1, -2, -3, ..., -24, -23, -22]])

现在,我们来计算所有随机漫步过程的最大值和最小值:

In [264]: walks.max()

Out[264]: 138

In [265]: walks.min()

Out[265]: -133

得到这些数据之后,我们来计算30或-30的最小穿越时间。这里稍微复杂些,因为不是5000个过程都到达了30。我们可以用any方法来对此进行检查:

In [266]: hits30 = (np.abs(walks) >= 30).any(1)

In [267]: hits30

Out[267]: array([False, True, False, ..., False, True, False], dtype=bool)

In [268]: hits30.sum() # Number that hit 30 or -30

Out[268]: 3410

然后我们利用这个布尔型数组选出那些穿越了30(绝对值)的随机漫步(行),并调用argmax在轴1上获取穿越时间:

In [269]: crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)

In [270]: crossing_times.mean()

Out[270]: 498.88973607038122

请尝试用其他分布方式得到漫步数据。只需使用不同的随机数生成函数即可,如normal用于生成指定均值和标准差的正态分布数据:

In [271]: steps = np.random.normal(loc=0, scale=0.25,

.....: size=(nwalks, nsteps))

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

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

相关文章

DBMS-数据库设计与E-R模型:E-R模型、约束、E-R图、E-R扩展特性、E-R图转换为关系模式、UML建模...

设计过程概览 1. 设计阶段 最初阶段:刻画未来数据库用户的数据需求,产品为用户需求规格说明; 概念设计阶段(conceptual-design phase):(关注描述抽象数据及其联系,通常使用实体-联系…

tooltip.css-2.0文档

tooltip.css 纯CSS鼠标提示工具。 v. 2.0.0 更新日期&#xff1a;2018.4.12 预览DEMO。 安装&#xff1a; 只需在页面中引入"tooltip.css"或“tooltip.min.css”文件即可。 如&#xff1a; <link rel"stylesheet" href"css/tooltip.css"…

Java虚拟机:如何判定哪些对象可回收?

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处&#xff0c;欢迎交流学习&#xff01; 在堆内存中存放着Java程序中几乎所有的对象实例&#xff0c;堆内存的容量是有限的&#xff0c;Java虚拟机会对堆内存进行管理&#xff0c;回收已经“死去”的对象&…

html标签object和embed,html标签object和embed的区别

object和embed的区别The code in bold above is the actual code that you need to place in your page to embed a FusionCharts chart.In the above code, weveused and tags to embed the 3D Column Chart (Column3D.swf) within the HTML page.used &dataUrlData.xml u…

Apache Apollo REST API

Apache Apollo是新一代&#xff0c;高性能&#xff0c;多协议的消息传递代理&#xff0c;它是从头开始构建的&#xff0c;可以替代ActiveMQ5.x。 我过去曾在博客上发表过文章 &#xff08;第一部分已经与第二部分一起发布了&#xff09;。 Apollo的非阻塞异步体系结构使其速度…

bzoj1588 [HNOI2002]营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17931 Solved: 7391[Submit][Status][Discuss]Description 营业额统计 Tiger最近被公司升任为营业部经理&#xff0c;他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 T…

python管道通信_Python进程通信之匿名管道实例讲解

匿名管道管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端.os.pipe()返回2个文件描述符(r, w),表示可读的和可写的.示例代码如下:复制代码 代码如下:#!/usr/bin/pythonimport timeim…

css3中的box-sizing属性的使用

box-sizing属性用来定义元素的width和height所表示的区域,该属性一般有三种值&#xff1a;content-box、border-box、inherit。 其中inherit表示box-sizing的值应该从父元素继承。 content-box和border-box的主要区别就是元素的width和height的值包不包括border、padding这两…

ES6扩展运算符...进行的数组删除

今天写了按照React小书写了Reducer&#xff0c;发现基础真是太重要了&#xff0c;所有关于上层建筑的细节都需要回到下层细节中去寻找&#xff0c;而且现在的基础也由ES3变成了ES6了。 const ADD_USER "ADD_USER" const DELETE_USER "DELETE_USER" const…

中南大学在线考试答案计算机基础,中南大学《计算机基础》在线考试题库(267题)(有答案).doc...

中南大学《计算机基础》在线考试题库(267题)(有答案).doc 计算机基础01 总共89题共100分 一. 单选题 (共35题,共35分) 1. 域名服务器DNS的主要功能是( )。 (1分) A.通过请求及回答获取主机和网络相关的信息 B.查询主机的MAC地址 C.为主机自动命名 D.合理分配IP地址 ★标准答案&…

自动化的OSGi测试运行器

在我的团队成员中&#xff0c;我以忘记维护&#xff08;JUnit&#xff09;测试套件而闻名。 我只是无法为此付出额外的手动为套件添加测试的步骤。 幸运的是&#xff0c;有连续的集成服务器通过命名模式收集测试。 如果我介绍的一项孤立测试失败了&#xff0c;那么它会脱颖而出…

php post请求后端拿不到值_PHP Post获取不到非表单数据的问题解决办法

问题描述在使用vue-axios向后端post数据时&#xff0c;PHP端获取不到post的数据。问题解决修改php.ini配置找到php.ini配置文件&#xff0c;查找enable_post_data_reading变量&#xff0c;修改为打开状态&#xff0c;注释掉句前分好; Whether PHP will read the POST data.; Th…

CSS制作简单loading动画

曾经以为&#xff0c;loading的制作需要一些比较高深的web动画技术&#xff0c;后来发现大多数loading都可以用“障眼法”做出来。比如一个旋转的圆圈&#xff0c;并不都是将gif图放进去&#xff0c;有些就是画个静止图像&#xff0c;然后让它旋转就完了。gif图也可以&#xff…

机器学习:多变量线性回归

************************************** 注&#xff1a;本系列博客是博主学习Stanford大学 Andrew Ng 教授的《机器学习》课程笔记。博主深感学过课程后&#xff0c;不进行总结非常easy遗忘&#xff0c;依据课程加上自己对不明确问题的补充遂有此系列博客。本系列博客包含线性…

Java对象复活

总览 收集覆盖了finalize&#xff08;&#xff09;的对象之后&#xff0c;将其添加到终结处理队列中&#xff0c;以在调用每个对象的finalize&#xff08;&#xff09;方法之后进行清理。 如果您复活该物体&#xff0c;会发生什么&#xff1f; 何时定稿&#xff1f; finalize方…

经过路由无法找到计算机,电脑无法启动服务提示系统找不到指定的路径(图)

原标题&#xff1a;"电脑无法启动服务提示系统找不到指定的路径"相关电脑问题教程分享。 - 来源:191路由网。众所周知&#xff0c;使用电脑的时候需要启动一些服务才能使用相关的功能&#xff0c;但是如果出现无法启动服务项&#xff0c;并且提示“错误3&#xff1a;…

有关域索引错误产生的原因及解决办法

1说明 数据库错误ORA-29861:域索引标记为LOADING/FAILED/UNUSABLE&#xff0c;其错误原因及解决办法&#xff0c;根据ORACLE官方文档的说法如下&#xff1a; // *Cause: An attempt has been made to access a domain index that is// being built or is marked faile…

详细解读css中的浮动以及清除浮动的方法

对于前端初学者来说&#xff0c;css浮动部分的知识是一块比较难以理解的部分&#xff0c;下面我将把我学习过程中的心得分享给大家。 导读&#xff1a; 1.css块级元素讲解 2.css中浮动是如何产生的 3.出现浮动后&#xff0c;如何清除浮动&#xff08;本文将涉及到多种清除浮动…

微信多开txt_电脑版微信怎么双开、多开

新建一个txt文本文件&#xff0c;在文件中写入如下代码&#xff1a;echo offstart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exestart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exeexit保存文本文件。这里需要注意的是&#xff1a…

java 基础--随笔

---恢复内容开始--- java 对大小写敏感。 java没有任何无符号类型&#xff08;unsigned&#xff09;。 C/C是编译型语言&#xff0c;java是解释性语言。 JAVA编译过程同C/C 的 编译有些不同。当C编译器编译生成一个对象的代码时&#xff0c;该代码是为在某一特定硬件平台运行而…