`
923723914
  • 浏览: 631644 次
文章分类
社区版块
存档分类
最新评论

python用于数学计算的工具介绍:scipy和numpy

 
阅读更多

SciPy入门指南

这个教程是为了帮助初学者掌握scipy并且肯能快地实际使用。

optimization

什么是scipy、numpy、matplotlib?

Python是一种通用语言。它被解释运行,是动态类型语言,并且非常适合交互工作和快速实现原型,然而又足够强大用来写大型应用。

NumPy是一个定义了数值数组和矩阵类型和它们的基本运算的语言扩展。

SciPy是另一种使用NumPy来做高等数学、信号处理、优化、统计和许多其它科学任务的语言扩展。

Matplotlib是一个帮助绘图的语言扩展。

它们是用来干什么的?

SciPy和其它这些能用来完成许多任务:

  • 首先它们很适于用来进行严重依赖数学和数值运算的计算,它们可以原生地使用数组、矩阵和对数组和矩阵的运算,求出特征根,计算积分,解决微分方程。

    NumPy的数组类(被用来实现矩阵类的基础)是考虑速度的实现,所以存取NumPy数组比存取Python列表速度更快。此外,NumPy实现一种数组语言,以致于不需要大多数循环。例如,普通Python(C等等也是相似的):

      a = range(10000000)
      b = range(10000000)
      c = []
      for i in range(len(a)):
        c.append(a[i] + b[i])
    

    这个循环将在几GHz的处理器上耗时5到10秒,而NumPy:

      import numpy as np
      a = np.arange(10000000)
      b = np.arange(10000000)
      c = a + b
    

    不仅这个更加简洁和易读,而且相比几乎是瞬间的,甚至NumPy的导入都比普通Python中的循环更快。为什么?Python是一种动态类型的解释语言,这意味着在每次循环迭代时它都必须检查运算对象a和b的类型来选则+正确的意义。(在python中+被用到许多地方,比如连接字符串、可以有不同元素类型的列表)当’+’的操作对象之一是一个NumPy数组时,NumPy的add函数将被Python自动选择,仅仅检测一次类型。然后它通过编译C函数执行”真正的”加法循环。这和普通python中的解释循环相比是非常快的。

  • 有许多通用的或特定用途的数值代码使用了numpy和scipy。参考局部软件索引来查看部分列表。Python有许多用来创建交互应用的高级的模块(例如TraitsUIwxPython)。和scipy一同使用这些是最快的创建科学应用的方法。

  • 使用ipython使得交互工作更加简单。数据处理,数值模型探索,在运行中尝试运算可以很快地从一个想法得到结果(参考artical on ipython)。
  • matplotlib模块制造高质量的绘图,通过它你可以把你的数据和模型转化为展示或文章用的图像。不必在一个程序中做数值计算,保存数据,然后用另一个绘图。

如何使用scipy工作

Python是一门语言,它有几个用户界面。没有一个单独的程序可以开始并且给一个集成的用户体验。取而代之的是各种使用python的方法。1

最普遍的方法是使用高级python交互shell来输入命令和运行脚本。脚本可以用任何编辑器来写,例如SPE,PyScripter,甚至notepad,emacs或者vi/vim。

scipy和numpy默认都没有提供绘图函数。它们仅仅是数值工具。推荐的绘图工具包是matplotlib

在Windows、Mac OS X和Linux下,所有这些工具都被Enthought Python发行版提供,获取更多关于安装这些的指导参考此站点安装scipy部分。

学习使用scipy

最快的使用scipy工作的方法可能就是这个交互数据分析教程

去学习Python语言,python教程可以让你迅速熟悉python语法和对象。你可以从http://docs.python.org/download.html下载这个教程。

Dave Kuhlman的numpy和scipy教程是另一个很好的介绍:http://www.rexx.com/~dkuhlman/scipy_course_01.html.

本站点上的文档Cookbook部分提供更多学习材料。

示例会话

交互工作

让我们看看在矩形窗函数的傅利叶变换。我们将使用一个交互python shell——ipython来做这个。因为我们想要通过交互绘图呈现结果,我们将启动使用--pylab参数启动ipython,这个参数允许使用matplotlib交互。

$ ipython --pylab
Python 2.5.1 (r251:54863, May  2 2007, 16:27:44)
Type "copyright", "credits" or "license" for more information.
IPython 0.7.3 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.
  Welcome to pylab, a matplotlib-based Python environment.
  For more information, type 'help(pylab)'.

ipython提供了许多方便的特性,想tab补全python函数和一个优秀的帮助系统。

In [1]: %logstart
Activating auto-logging. Current session state plus future input saved.
Filename       : ipython_log.py
Mode           : rotate
Output logging : False
Raw input log  : False
Timestamping   : False
State          : active

这个激活一个登录会话到一个文件。登录文件格式允许在以后就像一个python脚本一样被简单的执行,或编辑进一个程序。ipython也记录所有的输入输出(并把它们保存在叫In和Out的列表中),因此你可以启动有追溯的登录。

In [2]: from scipy import *

因为numpy和scipy不是构建在python中的,你必须显示地告诉python加载它们的特性。Scipy提供numpy所以当导入scipy时导入它是不必要的。

现在开始实际的数学:

In [3]: a = zeros(1000)
In [4]: a[:100]=1

第一行正如你所期望的那样简单地创建了一个有1000个0的数组;numpy默认使这些0是双精度浮点数,但是如果我想要单精度或复数,我可以指定zeors的额外参数。第二行把一百个元素设置成-1.

然后我想要对这个数组进行傅利叶变换,scipy提供fft函数来完成这些:

b = fft(a)

为了看看b是什么样的,我将使用matplotlib库。如果你使用”–pylab”启动ipython将不需要导入matplotlib。否则你应导入它:from pylab import *但是你将没有交互功能(当你创建时自动绘图)。

In [6]: plot(abs(b))
Out[6]: [<matplotlib.lines.Line2D instance at 0xb7b9144c>]
In [7]: show()

fft

这将出现一个显示b的图像的窗口,如果你启动ipython时使用--pylab的话show命令是不必要的。

我注意到如果我把b的0频移动到中间看起来更好。我可以通过连接b的后半部分和前半部分来实现,但是我记不清concatenate的语法了:

In [8]: concatenate?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in function concatenate>
Namespace:      Interactive
Docstring:
    concatenate((a1, a2, ...), axis=0)
    Join arrays together.
    The tuple of sequences (a1, a2, ...) are joined along the given axis
    (default is the first one) into a single numpy array.
    Example:
    >>> concatenate( ([0,1,2], [5,6,7]) )
    array([0, 1, 2, 5, 6, 7])
In [9]: f=arange(-500,500,1)
In [10]: grid(True)
In [11]: plot(f,abs(concatenate((b[500:],b[:500]))))
Out[11]: [<matplotlib.lines.Line2D instance at 0xb360ca4c>]
In [12]: show()

scipy-2

这得到了我想要的图像。我可以使用交互控制上下移动和缩放图片,并且为包含在出版物中产生postscript输出(如果你想要学习更多绘图知识,建议你阅读matplotlib教程)。

运行脚本

当你一遍又一遍重复做着相同的工作,把一些命令保存在文件中并把它们作为脚本在ipython中运行将很有用。你可以使用”Ctrl-D”退出当前的ipython会话并且编辑ipython_log.py文件。当你想要执行这个文件中的指令时,你可以打开一个新的ipython会话输入命令%run -i ipython_log.py

当编辑一个脚本文件时,在ipython中尝试一些命令也很方便。这将允许你在保存和运行之前,对一些简单的情况逐行尝试你的脚本。

一些关于导入(import)的笔记

如果你仅仅初学scipy和与其伴侣,以下的东西对你并不那么重要,不要太操心。但是当你开发一些大型的应用时最好记住它。

对交互工作(在ipython中)和一些小型的脚本使用from scipy import *没什么。这样将会有个优点就是所有的功能在当前命名空间都是立即可用的。然而,对大型的程序和软件包来说,建议只导入你真正需要的函数和模块。让我们考虑这种情况:你(为了无论什么理由)想要比较numpy和scipy的fft函数。在你的脚本中你应这样写:

# import from module numpy.fft
from numpy.fft import fft
# import scipy's fft implementation and rename it;
# Note: `from scipy import fft` actually imports numpy.fft.fft (check with
# `scipy.fft?` in Ipython or look at .../site-packages/scipy/__init__.py)
from scipy.fftpack import fft as scipy_fft

这个优势就是,当你查看代码时,你可以显式的知道你在导入什么,代码便因此变得清晰和可读。而且,这通常比通过import *导入所有东西更快,特别是如果你是从一个像scipy一样特别大的库中导入。

然而,如果你使用许多不同的numpy函数,如果你显式导入每一个函数导入声明将变得非常长。但是你可以导入整个包来代替使用import *

from numpy import *  # bad
from numpy import abs, concatenate, sin, pi, dot, amin, amax, asarray, cov, diag, zeros, empty, exp, eye, kaiser # very long
import numpy         # good
# use numpy.fft.fft() on array 'a'
b = numpy.fft.fft(a)

没关系,因为通常import numpy非常快。另一方面,scipy相当大(有很多子包)。因此from scipy import *第一次导入可能非常慢(所有接下来的导入声明将会更迅速地执行,因为实际上没有再次导入)。这是为什么当你导入scipy时子包的导入默认被禁止(像scipy.fft),这样它才能像import numpy一样快。如果你想使用比如说scipy.fft,你不得不显式的导入它(这无论如何是个好的想法)。如果你想要一次加载所有子包,你将不得不import scipy; scipy.pkgbuild()。使用ipython的交互会话,你可以通过scipy profile调用它(ipython -p scipy),为你读取scipy的配置文件(通常在~/.ipython/ipythonrc-scipy)和加载所有scipy。对在即时交互环境使用scipy和matplotlib绘图,你可以用像这样的命令ipython --pylab -p scipy


文章摘自:http://reverland.org/python/2012/08/24/scipy/

获得更多有关全面概述包结构和”pythonic”导入惯例的信息,看一看Python教程的这一部分

分享到:
评论

相关推荐

    WINDOWS下安装 Python扩展库 SCIPY和NUMPY +图文安装说明

    SciPy是一个开源的Python算法库和数学工具包。 SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。与其功能相类似的...

    Python三维可视化:Scipy基础一.pdf

    SciPy的介绍 •在Numpy库的基础上増加了众多的数学、科学以及工程计算中常用 的库函数 •例如: •线性代数 •常微分方程数值求解 •信号处理 •图像处理 •稀疏矩阵

    python进阶学习笔记-Numpy和SciPy

    NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含: 一个强大的N维数组对象 ndarray 广播功能函数 整合 C/C++/Fortran 代码的工具 线性代数、傅里叶变换、随机数生成等功能 上面提到了ndarray,那...

    Python-SciPy函数库在NumPy库的基础上增加了众多的数学科学以及工程计算中常用的库函数

    SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。

    scipy:Scipy库主存储库

    SciPy(发音为“ Sigh Pie”)是用于数学,科学和工程的开源软件。 它包括用于统计,优化,积分,线性代数,傅立叶变换,信号和图像处理,ODE求解器等的模块。 网站: : 文档: : 邮件列表: : 源代码: : ...

    科大讯飞营销算法大赛源码+学习说明(冠军方案).zip

    numpy: 1.14.3 scipy: 1.1.0 wengyp_demo.py: anaconda: 5.2.0 python: 2.7.13 pandas: 0.20.1 scikit-learn: 0.19.1 lightgm: 2.0.10 numpy: 1.14.2 scipy: 1.0.0 wanghe_demo.py: ...

    NumPy攻略:Python科学计算与数据分析.mobi

    书中不仅介绍了NumPy的安装、使用和各种相关概念,还介绍了如何利用这一最新的开源软件库,以尽可能接近传统数学语言的方式,编写可读性好、实现效率高和运行速度快的代码。最后还探究了几个和NumPy相关的科学计算...

    python数据分析基础教程numpy学习指南第2版2205449.mobi

    NumPy是一个优秀的科学计算库,提供了很多实用的数学函数、强大的多维数组对象和优异的计算性能,不仅可以取代Matlab和Mathematica的许多功能,而且业已成为Python科学计算生态系统的重要组成部分。但与这些商业产品...

    NumPy攻略 Python科学计算与数据分析 [(印尼)IvanIdris著;张崇明译][人民邮电出版社][2013.10][174页]

    书中不仅介绍了NumPy的安装、使用和各种相关概念,还介绍了如何利用这一最新的开源软件库,以尽可能接近传统数学语言的方式,编写可读性好、实现效率高和运行速度快的代码。最后还探究了几个和NumPy相关的科学计算...

    python数学实验与建模代码.docx

    这些库提供了许多数学函数和工具,可以帮助我们进行数学计算和可视化。 接下来,我们可以使用Python进行各种数学实验,如求解方程、求导、积分、线性代数等。例如,我们可以使用NumPy库来求解线性方程组: ```python...

    scipy.txt python第三方库SciPy库百度云下载地址,官方下载太慢了,下载好了分享给大家

    scipy-1.4.1-cp37-cp37m-win_amd64.whl Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值...它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

    win版 SageMath-9.3-Installer-v0.6.3下载

    集成了多个数学软件包和工具,包括Maxima、GAP、PARI/GP、SciPy、NumPy等。 提供了Python编程语言的接口,使得用户可以使用Python的强大功能进行数学计算和数据分析。 提供了交互式计算环境,可以直接在命令行中...

    scipy-0.11.0

    SciPy (pronounced "Sigh Pie") 是一个开源的数学、科学和工程计算包。 [转载]正确安装Scipy-0.9和numpy-1.6 http://blog.sina.com.cn/s/blog_7948610e0100tbr9.html 在64位的Linux集群上安装scipy0.9是一个很...

    基于python的深度神经网络原理与实践

    NumPy:Python的一个数值计算扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 SciPy:用于解决科学和工程问题的强大库,包括优化、线性代数、积分、特殊函数等。 Matplotlib:...

    非线性优化 python

    丰富的库和工具支持: Python拥有强大的科学计算生态系统,如NumPy、SciPy、SymPy等,这些库提供了丰富的数学和优化工具。SciPy库中的scipy.optimize模块包含了多种非线性优化算法,使得实现和调整优化问题变得相对...

    scipy-1.3.0-cp37-cp37m-win_amd64.whl

    用于机器学习的在python上的一个插件,Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解...它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

    SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数-python开发

    SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。 SciPy SciPy(发音为“Sigh Pie”)是用于数学、科学和...

    python数据分析笔记

    更重要的是, NumPy与SciPy、 Matplotlib、 SciKits等其他众多Python科学计算库很好 地结合在一起,共同构建了一个完整的科学计算生态系统。毫不夸张地讲, NumPy是使用Python 进行数据分析的一个必备工具。

    Python之Pandas知识点

    在这里简单分别一下:NumPy:数学计算库,以矩阵为基础的数学计算模块,包括基本的四则运行,方程式以及其他方面的计算什么的,纯数学;SciPy:科学计算库,有一些高阶抽象和物理模型,在NumPy基础上,封装了一层,...

Global site tag (gtag.js) - Google Analytics