返回顶部
首页 > 资讯 > 后端开发 > Python >Python科学计算学习之高级数组(二)
  • 386
分享到

Python科学计算学习之高级数组(二)

数组高级科学 2023-01-31 00:01:14 386人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

代码性能和向量化   背景:python是一种解释型的编程语言,基本的Python代码不需要任何中间编译过程来得到机器代码,而是直接执行。而对于C、c++等编译性语言就需要在执行代码前将其编译为机器指令。 但是,解释型代码的速度比编译

  1. 代码性能和向量化

  背景:python是一种解释型的编程语言,基本的Python代码不需要任何中间编译过程来得到机器代码,而是直接执行。而对于C、c++等编译性语言就需要在执行代码前将其编译为机器指令。 但是,解释型代码的速度比编译型代码要慢,为了使得python代码更快,最好尽可能的使用Numpy和Scipy包中的函数编写部分代码。(注意:numpy和scipy是诸如C、C++等编译型语言编写实现的)

例如:Python语言的numpy向量化语句为什么比for快?

python之类语言的for循环,和其它语言相比,额外付出了什么。

python是解释执行的。举例来说,执行 x = 1234+5678 ,对编译型语言,是从内存读入两个short int到寄存器,然后读入加法指令,通知CPU内部的加法器动作,最后把加法器输出存储到x对应的内存单元(实质上,最后这个动作几乎总会被自动优化为“把加法器输出暂存到寄存器而不是内存单元,因为访问内存的时间消耗常常是访问寄存器的几十倍”)。一共2~4条指令(视不同CPU指令集而定)。

而换了解释性语言,它得先把“x = 1234+5678”当成字符串,逐个字符比对以分析语法结构——不计空格这也是11个字符,至少要做11个循环;每个循环至少需要执行的指令有:取数据(如读'x'这个字符)、比较数据、根据比较结果跳转(可能还得跳转回来)、累加循环计数器、检查循环计数器是否到达终值、根据比较结果跳转。这就是至少6条指令,其中包含一次内存读取、至少两次分支指令(现代CPU有分支预测,若命中无额外消耗,否则……)。总计66条指令,比编译型语言慢至少17倍(假设每条指令执行时间相同。但事实上,访存/跳转类指令消耗的时间常常是加法指令的十倍甚至百倍)。这还只是读入源码的消耗,尚未计入“语法分析”这个大头;加上后,起码指令数多数百倍(消耗时间嘛……我猜起码得多数千倍吧)。

  1. 向量化

     为提升代码的性能(运行时间),通常需要将代码向量化。使Numpy包的切片、运算符和函数来替代代码中的for循环以及运行速度较慢的代码片段,可以显著提高代码的性能。

规则:尽可能避免使用for循环而采用向量化形式,善用python的numpy库中的内置函数。例如:np.exp ,np.log ,np.maxmum(v,0) 等。

简单实例进行说明:

import numpy as np

import time

 a = np.random.rand(1000000)

b = np.random.rand(1000000)

tic = time.time()       

c = np.dot(a, b)       #向量化运算

toc = time.time()

print("c: %f" % c)

print("vectorized version:" + str(1000*(toc-tic)) + "ms")

#采用for循环语句进行编程

c = 0

tic = time.time()

for i in range(1000000):

    c += a[i] * b[i]

toc = time.time()

print("c: %f" % c)

print("for loop:" + str(1000*(toc-tic)) + "ms")

运行结果:

c: 250099.479223

vectorized version:32.00173377990723ms

c: 250099.479223

for loop:1680.09614944458ms  #可见,向量化的实现代码速度上有飞速提升,而且代码看起#来更加简洁。

##说明,无论有多长的数据列表并且需要对他们进行数学转换,考虑将这些python数据

结构转换为numpy.ndarray对象并使用固有的矢量化功能。

  1. Python广播

     当两个数组中每个元素都进行相应的运算的时候,需要两个数组的形状相同,如果形状不同,则使Python的广播机制进行处理。例如,当一个向量(一维数组)和一个标量(零维数组)相加时,为了能够执行加法,标量需扩展为向量,这种通用机制称为广播。

3.1广播数组:

“广播”的一个工作原则是:两个数组的维度应该相同(即要对一个二维数组进行广播,那么用来广播的数组也应该是二维的),并且只能有一个维度的长度允许不一样,且那个不一样的维度在用来广播的数组里面的长度应该为1(比如,对于一个(3,4)的二维数组,那么用来广播的数组必须是(3,1)或(1,4);比如对于一个三维的数组(3,4,5),用来广播的数组必须是(1,4,5)或(3,1,5)或(3,4,1)),这样子,我们才说两个数组是广播兼容的。广播会在沿着长度为1的那个维度进行扩散进行。(广播原则:如果两个数组的后缘维度(即:从末尾算起的维度)的轴长相符或者其中的一方长度为1,则认为广播兼容,广播在缺失和长度为1的轴上进行)

如下实例:说明广播是如何操作的:重塑、扩展

import numpy as np

a=np.arange(0,60,10).reshape(-1,1) #建立一个二维数组,形状数(6,1)

print(a.shape)

print(a)

b=np.arange(0,5)   #建立一个一维数组b(向量),形状为(5,)

print(b.shape)

print(b)

c=a+b          #注意:此处向量需要被广播,第一运算步骤为:重塑,将向量的形状从(5,)转换为(1,5)。第二步运算是扩展,将向量的形状从(1,5)转换为(6,5)。              #注意:形状(n,)不能自动广播到向量(m,n)

print(c.shape)

print(c)

运行结果:

(6, 1)

[[ 0]

 [10]

 [20]

 [30]

 [40]

 [50]]

(5,)

[0 1 2 3 4]

(6, 5)

[[ 0  1  2  3  4]

 [10 11 12 13 14]

 [20 21 22 23 24]

 [30 31 32 33 34]

 [40 41 42 43 44]

 [50 51 52 53 54]]

解释:

首先b.shape=(1,5)  #由于a与b的维数不一样,首先需让b的维度(shape

#属性性)向a对齐,即向量变为矩阵

print(b.shape)

print(b)

其次,加法的两个输入数组属性分别为(6,1)和(1,5),输出数组的各个轴的长度为输入数组各个轴的长度的最大值,则输出数组的属性为(6,5);将b在第0轴进行复制,a在第一轴上进行复制。

结果为:

a=a.repeat(5,axis=1)      

print(a)

b=b.repeat(6,axis=0)

print(b)

[[ 0  0  0  0  0]

 [10 10 10 10 10]

 [20 20 20 20 20]

 [30 30 30 30 30]

 [40 40 40 40 40]

 [50 50 50 50 50]]

[[0 1 2 3 4]

 [0 1 2 3 4]

 [0 1 2 3 4]

 [0 1 2 3 4]

 [0 1 2 3 4]

 [0 1 2 3 4]]

注意:numpy内部不会使用repeat进行数据扩展,而是使用内部集成的函数ogrid(创建广播预算用的数组)和mgrid函数(返回是进行广播后的数组)

3.2 Python的广播方便与计算:

① 一维向量+常量

import numpy as np

vector=np.arange(4)

b=vector+1.

print(b.shape)

print(b)    #result为:(4,)    向量[1. 2. 3. 4.]

② 多维向量+常数

③ 多维向量+行向量

④ 多维向量+列向量

a=np.array([[1,2,3],[4,5,6]])

b=[1,2,3]

c=[[4],[5]]

print(a)

print(a+1)

print(a+b)

print(a+c)     #运行结果:

[[1 2 3]

 [4 5 6]]

[[2 3 4]

 [5 6 7]]

[[2 4 6]

 [5 7 9]]

[[ 5  6  7]

 [ 9 10 11]]

 

--结束END--

本文标题: Python科学计算学习之高级数组(二)

本文链接: https://lsjlt.com/news/181618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python科学计算学习之高级数组(二)
    代码性能和向量化   背景:Python是一种解释型的编程语言,基本的python代码不需要任何中间编译过程来得到机器代码,而是直接执行。而对于C、C++等编译性语言就需要在执行代码前将其编译为机器指令。 但是,解释型代码的速度比编译...
    99+
    2023-01-31
    数组 高级 科学
  • python科学计算学习二:matplo
        博客地址:http://blog.csdn.net/ikerpeng/article/details/20523679     首先补充以下:7种颜色 r g b y m c k (红,绿,蓝,黄,品红,青,黑)     在科研...
    99+
    2023-01-31
    科学 python matplo
  • Python3.0科学计算学习之函数
    函数 函数允许程序的控制在不同的代码片段之间切换,函数的重要意义在于可以在程序中清晰地分离不同的任务,将复杂的问题分解为几个相对简单的子问题,并逐个解决。即“分而治之”。  Python的自建模块一般体现为函数。Python函数有如下特点...
    99+
    2023-01-31
    函数 科学
  • Python3.0科学计算学习之类
    类:        Python中的类是一个抽象的概念,甚至比函数还要抽象。可以把它简单的看作是数据以及由存取、操作这些数据的方法所组成的一个集合。类是Python的核心概念,是面向对象编程的基础。       类有如下的优点: 类对象是...
    99+
    2023-01-31
    科学
  • python学习之数组二
    作用于数组的函数: 通用函数:函数基于元素的,以单元方式作用于数组的,返回的是与原数组具有相同形状的数组。 不通用函数(数组函数):函数能以行或者列的方式作用于整个矩阵;如果没有提供任何参数时,它们将作用于整个矩阵。例如:max、sum和...
    99+
    2023-01-31
    数组 python
  • Python3.0科学计算学习之绘图(一
    基本绘图: (1)  plot是标准的绘图库,调用函数plot(x,y)就可以创建一个带有绘图的图形窗口(其中y是x的函数)。输入的参数为具有相同长度的数组(或列表);或者plot(y)是plot(range(len(y)),y)的简...
    99+
    2023-01-31
    科学
  • Python3.0科学计算学习之绘图(三
    matplotlib对象:  使用matplotlib的pyplot模块,可以供用户直接使用最重要的绘图命令。多数情况下,我们希望创建一个图形并且立即展示出来,但是有时如果生成要通过更改其属性来修改的图形,就需要用面向对象的方式来处理图形...
    99+
    2023-01-31
    科学
  • Python3.0科学计算学习之绘图(四
    绘制三维图: mplot3d工具包提供了点、线、等值线、曲面和所有其他基本组件以及三维旋转缩放的三维绘图。 1.散点的三维数据图 from mpl_toolkits.mplot3d import axes3d               ...
    99+
    2023-01-31
    科学
  • python科学计算常用的数学科学计算库是什么
    这篇文章给大家分享的是有关python科学计算常用的数学科学计算库是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • Python科学计算之Pandas详解
    起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提供了很好的支持。 Pandas 的名称来自于面板数据(panel data)和python数据分析 (data ...
    99+
    2022-06-04
    详解 科学 Python
  • Python学习之高级特性
    切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取。这种方法可以帮助我们依次获取我们想要的元素。而切片可以帮助我们获取被切片元...
    99+
    2023-01-30
    特性 高级 Python
  • PHP学习笔记:科学计算与数值模拟
    引言:在当今科技大潮的推动下,科学计算和数值模拟在学术研究和工程实践中扮演着重要的角色。而作为一门功能强大的编程语言,PHP不仅可以用于网站开发和数据处理,也可以用于科学计算和数值模拟。本文将简要介绍PHP的科学计算和数值模拟基础,并提供具...
    99+
    2023-10-21
    PHP 科学计算 数值模拟
  • Python Tkinter学习之计算器
    初学Python tkinter,利用目前所学编写一个简单的计算器练习一下。预期效果:1.能够实现加减乘除运算,2.只能输入数字3.通过按钮选择进行哪种运算。4.结果框不能修改,智能复制5.按清除按钮能够清除所有内容 from  tkint...
    99+
    2023-01-31
    计算器 Python Tkinter
  • 【数据科学系统学习】机器学习算法 #
    本篇内容为《机器学习实战》第 6 章 支持向量机部分程序清单。所用代码为 python3。 支持向量机优点:泛化错误率低,计算开销不大,结果易解释。 缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二分类问题。适用数据...
    99+
    2023-01-31
    算法 机器 科学
  • Python科学计算之NumPy入门教程
    前言 NumPy是Python用于处理大型矩阵的一个速度极快的数学库。它允许你在Python中做向量和矩阵的运算,而且很多底层的函数都是用C写的,你将获得在普通Python中无法达到的运行速度。这是由于矩...
    99+
    2022-06-04
    入门教程 科学 Python
  • 科学计算库Numpy——数值计算
    矩阵 求和 乘积 最大值和最小值 最大值和最小值的位置 平均数 标准差 方差 限制 四舍五入 ...
    99+
    2023-01-31
    数值 科学 Numpy
  • Python 科学计算和绘图
    转自:http://python.jobbole.com/87471/原文出处: 達聞西   给深度学习入门者的Python快速教程基础篇numpy和Matplotlib篇本篇部分代码的下载地址:https://github.com/fr...
    99+
    2023-01-31
    科学 Python
  • python学习之旅(二)
    Python基础知识(1) 一、变量 变量名可以由字母、数字、下划线任意组合而成。 注意:1.变量名不能以数字开头;            2.变量名不能为关键字;            3.变量名尽量起有意义的,能够通过变量名知道代表的...
    99+
    2023-01-30
    之旅 python
  • Linux高级篇学习手册(二)
    目录1. linux的crontab定时任务1.1 配置定时任务2. Linux的服务管理6.1 服务管理2.2 服务自启动2.3 演示效果总结1. Linux的crontab定时任务 任务调度:是...
    99+
    2022-06-04
    Linux学习 Linux基础
  • Python 科学计算基础 (整理)
    Python是一种面向对象的、动态的程序设计语言,具有非常简洁而清晰的语法,既可以用于快速开发程序脚本,也可以用于开发大规模的软件,特别适合于完成各...
    99+
    2023-01-31
    基础 科学 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作