《Python科学计算最佳实践:SciPy指南》试读:前言

与那种老式刻板的结婚礼服不同,如果用技术术语来描述的话,它是优雅的,宛如通过寥寥几行代码就能得出令人赞叹的结果的计算机算法。 ——格雷姆•辛浦生,《罗茜效应》 欢迎阅读本书。因为我们将用大部分篇幅讨论书名中的“SciPy”,所以先花点时间说明一下“优雅”这个词。现在有很多介绍SciPy库的手册、教程和文档网站,但本书讲述得更加深入,它不但会教你如何编写有效的代码,还会激励你将代码变得更加酷炫! 在《罗茜效应》(一本妙趣横生的小说;学完本书后,你可以阅读一下它的前作《罗茜计划》)中,格雷姆•辛浦生颠覆了“优雅”这个词的传统含义。多数人会用这个词来形容某物在视觉上的简单、时髦和优美,比如第一代iPhone。但格雷姆•辛浦生著作中的主人公唐•蒂尔曼却用计算机算法来定义优雅。读完本书后,希望你能确切地理解他的意思,因为你将在本书中阅读或编写一段优雅的代码,并在它美妙高雅的光辉下感受内心的平静。 一段良好的代码在感觉上就是正确的。当查看这种代码时,它的意图是明确的,形式是简洁的(但不至于晦涩),而且能高效地完成当前工作。对于作者而言,分析优雅代码的乐趣在于找出其中隐藏的知识,以及由其激发出的解决新编程问题时的创造性。 具有讽刺意味的是,创造性还会引诱我们为了炫耀自己的睿智而编写出难以理解的代码,而承受这种代价的是代码阅读者。PEP 8(“Python编码规范”)和PEP 20(“Python之禅”)提醒我们,阅读代码要比编写代码频繁得多,因此可读性最重要。 优雅代码的简洁性来自抽象和正确使用函数,而非大量的函数嵌套调用。可能需要一两分钟来领会这种代码,但最终肯定有一个恍然大悟的时刻。一旦搞清楚代码的各个组成部分,它的正确性就显而易见了。要想提高代码的可读性,可以使用清晰明确的变量和函数名称,并精心编写注释,注释不仅要描述代码,还应该解释代码。 软件工程师J. Bradford Hipps最近在《纽约时报》上发表了一篇文章,他认为,“要想写出更好的代码,就应该阅读一下弗吉尼亚•伍尔芙的作品”。文章选段如下: 在实践中,软件开发更多的时候是一种创造性活动,绝不是机械的算法。 开发人员站在源代码编辑器前,就像是作家面对着空白的稿纸。……他们都对循 规蹈矩的做事方式表现出理所当然的焦躁,并从内心深处渴望打破常规。当完成 一段程序或一页作品时,它们的质量评判标准在很大程度上是一样的:优雅、简 洁、内聚,没有一点故弄玄虚的东西,甚至堪称漂亮。 这也是本书所持的立场。 至此,本书英文版书名中的“优雅”(elegant)讨论完毕,接下来将介绍其中的“SciPy”。 根据上下文,“SciPy”可以是一个软件库、一种生态系统或一个社区。SciPy 如此优秀的 部分原因就在于它有特别出色的在线文档和教程,这使得我们根本不需要其他参考书。但 是,我们希望本书能够帮助你用 SciPy 编写出最好的代码。 我们选择的代码集中体现了 NumPy、SciPy 和相关库中的高级功能,并演示了这些功能聪 明而又优雅的使用方法。初学者可以学会如何通过优美的代码应用这些库来解决实际问 题。我们也将用真实的科学数据使书中的示例更加生动有趣。 像 SciPy 本身一样,我们也希望本书是由社区驱动的。书中的很多示例都取自 Python 科学 生态系统中的实际代码,它们生动地体现了我们描绘的优雅代码的准则。 目标读者 本书旨在将你的 Python 水平提高到一个新的层次。你将通过实例用最棒的代码来学习 SciPy。 在开始学习之前,你至少应该了解 Python,知道变量、函数、循环和一点 NumPy 的知识。 或许你已经通过一些高级读物提高了 Python 技能,比如《流畅的 Python》1。如果这不符合 你的情况,那么在继续学习本书前,你应该先学习一下 Python 的入门教程,比如 Software Carpentry 的网站。 或许你还搞不清 SciPy stack 到底是一个库还是 IHOP 松饼屋菜单上的一道菜,也不确定什 么是 SciPy 最佳实践。或许你是一位科研人员,在网上读过一些 Python 教程,从另一个实 验室或自己实验室的前成员那里下载了一些分析脚本,头昏脑胀地乱改了一通。可能你觉 得自己正在学习 SciPy 编程的路上孤军奋战,但其实并不是。 在学习过程中,我们会教你如何将互联网作为参考,并介绍一些邮件列表、库和相关会 议,在那里你会遇到一些志同道合的科研人员,他们已经在这条路上先行了一步。 虽然这本书你可能只会阅读一次,但也许会多次借此寻求灵感和启发(也可能欣赏一些优 雅的代码片段)。 注 1: 参见图灵社区:http://www.ituring.com.cn/book/1564。——编者注 为什么使用SciPy NumPy 和 SciPy 共同组成了 Python 科学应用生态系统的核心。SciPy 软件库实现了很多用 于科学数据处理的函数,比如用于统计学、信号处理、图像处理和函数优化。SciPy 是建立在NumPy 之上的,NumPy 是Python 中用于数值型数组计算的库。在过去的几年中,基于NumPy 和SciPy,一个包括应用和库文件的完整生态系统迅速发展起来,并在天文学、生物学、气象学和气候科学,以及材料科学等多个学科得到了广泛应用。 这种发展方兴未艾。2014 年,Thomas Robitaille 和Chris Beaumont 整理了Python 在天文学领域不断增长的应用。这是我们找到的2016 年下半年的最新图形结果。 图 很明显,SciPy 及其相关的库在未来几年将支持大量科学数据分析任务。 再举个例子,Software Carpentry 是一个专门向科研人员传授计算技能的组织,其中最常用的语言就是Python,现在相关课程已经供不应求。 什么是SciPy生态系统 SciPy(读作Sigh Pie)是一个基于Python 的用于数学、科学和工程学的开源软件生态系统。 ——http://www.scipy.org SciPy 生态系统是Python 包的一个松散集合。本书将介绍以下主要内容。 NumPy 是Python 科学计算的基础。它提供了高效的数值数组,并广泛支持数值计算, 其中包括线性代数、随机数和傅里叶变换。NumPy 的杀手级特性是“N 维数组”,又称ndarray。这些数据结构可以高效地存储数值型数据,并能定义任何维度的网格(稍后将做更多介绍)。 SciPy 库是一个高效的数值算法集合,用于信号处理、集成、优化和统计学等领域。其中的程序都使用了用户友好型界面进行包装。 Matplotlib 是一个功能强大的二维(和基本的三维)绘图包。它的名称来自于受Matlab 启发而发明的语法。 IPython 是一个交互式的Python 界面,它允许你快速地与数据和测试方案交互。 Jupyter 笔记本在浏览器中运行,可以构建样式丰富的文档,将代码、文本、数学表达式和可交互部件组合在一起。2 实际上,为了生成本书,需要将文本转换为Jupyter 笔记本并运行(这样我们就可以知道所有示例都能够正确运行)。Jupyter 最初是作为IPython 的扩展而开发的,但现在可以支持多种语言,其中包括Cython、Julia、R、Octave、Bash、Perl 和Ruby。 pandas 通过一个便于使用的软件包提供了快速、列式的数据结构。它特别适合处理有标记的数据集,如表格和关系数据库,还适合管理时间序列数据和滑动窗口。pandas 中还有很多便利的数据分析工具,可以解析、清洗、聚合和绘制数据。 scikit-learn 为机器学习算法提供了统一的接口。 scikit-image 提供了能与SciPy 生态系统其他部分完美集成的图像分析工具。 很多Python 软件包组成了SciPy 生态系统的其他部分,本书也会涉及其中一些。虽然本书重点介绍NumPy 和SciPy,但正是因为存在大量与它们紧密关联的软件包,Python 才成为了科学计算的强大工具。 天翻地覆:从Python 2到Python 3 在使用Python 的过程中,你应该对哪个Python 版本更好的争论有所耳闻。或许你对此非常诧异,难道不是最新版本更好吗?(先剧透一下:确实是最新版本更好。) 2008 年末,Python 核心开发团队发布了Python 3,对这种语言进行了一次重大更新,主要改进包括更好的Unicode(国际标准)文本处理、类型的一致性以及流式数据处理等。正如Douglas Adams 对宇宙初创的风趣评论一样3,“这令很多人勃然大怒,被普遍认为是一种倒退”。这是因为,如果不进行一些修改,Python 2.6 或Python 2.7 的代码一般不能由Python 3 直接解释(尽管这些改动一般没有什么破坏性)。 向前发展与向后兼容总是要进行一番角力。对于这个问题,Python 核心团队决定做一个彻底的改变,消除Python(特别是底层C 语言API)中的不一致性,从而使Python 成为一门21 世纪的语言(Python 1.0 发布于1994 年,距今已有20 余年,在技术界已经是相当长的时间)。 以下是Python 3 中的一处改进。 print "Hello World!" # Python 2 打印语句 print("Hello World!") # Python 3 打印函数 为什么非要不嫌麻烦地加上一对括号呢?是的,括号确实比以前麻烦,但如果你想要输出到另一个流中,如常用于存放调试信息的标准错误流,该怎么办呢? 注2: 参见Fernando Perez 的文章“‘Literate computing’ and computational reproducibility: IPython in the age of data-driven journalism”。 注3: ADAMS D. The Hitchhiker’s guide to the galaxy [M]. London: Pan Books, 1979. print >>sys.stderr, "fatal error" # Python 2 print("fatal error", file=sys.stderr) # Python 3 此时这种改动看起来就很有价值。Python 2 中的代码到底表示什么意思呢?我们确实不大明白。 Python 3 的另一项改进是将整数除法修改为符合大多数人习惯的形式。(注意:>>> 表示我们正在Python 交互式环境中进行输入。) # Python 2 >>> 5 / 2 2 # Python 3 >>> 5 / 2 2.5 2015 年,Python 3.5 引入的新矩阵乘法操作符@ 也非常令人激动,你将在第5 章和第6 章中看到这个操作符的实际应用。 Python 3 中的最大改进可能就是对Unicode 的支持,Unicode 是一种文本编码方式,它不但包括英文字母表,还包括世界上所有的字母表。Python 2 允许你定义一个Unicode 字符串, 如下所示。 beta = u"β" 但在Python 3 中,一切都是Unicode。 β = 0.5 print(2 * β) 1.0 Python 核心团队做出了正确的决策,在Python 代码中一视同仁地支持所有语言的字符。如今这个决策看起来尤其英明,因为大多数新程序员来自于非英语国家。考虑到互操作性, 我们还是建议在多数代码中使用英文字符,但这种能力迟早会派上用场,比如在包含大量数学公式的Jupyter 笔记本中。 在IPython 终端或Jupyter 笔记本中,先输入一个LaTeX 符号名称,紧接着按Tab 键,就可以将其转换为Unicode。例如,\bet<TAB> 可以变为β。 Python 3 的更新也破坏了很多现有的2.x 版代码,一些代码比以前运行得更慢。尽管会有这样的问题,我们还是建议所有人都尽快升级到Python 3(Python 2.x 的维护期到2020 年就结束了),因为随着3.x 系列的逐渐成熟,大多数问题已经被解决。实际上,本书中的很多新语言特性就来自于Python 3。 本书使用的是Python 3.6。 如果想要阅读更多相关内容,可以查看Ed Schofield 在Python-Future 网站上提供的资源, 以及Nick Coghlan 关于这种版本转换的详细指南。 SciPy生态系统和社区 SciPy 是一个功能丰富的主流库。与NumPy 一样,它也是Python 的杀手级应用之一。在SciPy 功能的基础之上,衍生了大量相关库,本书中涉及了其中很多库。 这些库的作者和用户在世界各地的很多活动和会议上聚集,包括一年一度的美国奥斯汀SciPy 大会、EuroSciPy、SciPy India、PyData,等等。我们强烈建议你参加其中一项活动, 与Python 世界中最优秀的科学软件的开发者会面。如果你无法亲自前往,或者只想感受一下这些会议的气氛,很多人会在网络上发布他们的演讲,你可以看一下。 免费的开源软件 SciPy 社区支持开源软件开发,几乎所有SciPy 库的源代码都可以免费获取,任何人都可以阅读、编辑和重用这些源代码。 如果希望别人使用你的代码,最好的一种实现方式就是让代码免费而且公开。如果使用了封闭源码的软件,但它不能完全满足你的需求,那只能说你运气不佳。你可以给开发者发邮件,请求他们添加新的功能(通常无济于事),也可以自己开发新的软件。但如果代码是开源的,那么你就可以轻松地使用从本书中学到的技能来添加或修改软件的功能。 同样,如果你发现了一个软件的bug,那么对用户和开发者来说,能够接触到源代码可以使事情变得更加容易。即使不能完全理解代码,通常也可以更加深入地诊断问题,并帮助开发者进行修复,这对所有人来说都是很好的学习经历。 开放的源码,开放的科学 在科学软件开发中,上述场景都极其常见,而且非常重要:科学软件一般都是建立在前人的工作基础之上,或者是对其做了一些有趣的修改。此外,因为科学成果发布和改进的节奏非常快,很多代码在发布之前都没有经过充分的测试,所以科学软件或多或少都有bug。 代码开源的另一个重要原因是为了促进可重复性研究。许多人都有过这种经历:读了一篇非常精彩的论文,然后下载代码并在自己的数据上进行试验,结果却发现可执行文件不是为自己的操作系统编译的,程序无法运行,程序有bug,某个功能缺失,或者产生了出人意料的结果。通过将科学软件开源,不但可以提高软件质量,还可以使科学发现过程一目了然,比如假设是如何做出的,哪些地方有硬编码?开源可以解决很多类似的问题。开源还允许科研人员基于同行的代码继续开发,培养新的协作关系,加速科学研究的进程。 开放源码许可证 如果想让别人使用你的代码,你必须选择一种开源许可证。如果没有开源许可证,那么代码默认就是封闭的。即使你公开了代码(比如将代码放在一个公开的GitHub 仓库中),没有软件许可证的话,任何人也都不能使用、修改或重新发布你的代码。 在众多许可证选项中进行选择时,你必须先确定允许别人用你的代码做什么。你想让别人通过销售你的代码或使用了你的代码的软件来获取利润吗?你想限制代码仅供免费软件使用吗? 免费的开源软件许可证有两大类: 宽松式(permissive)许可证 copy-left 许可证 宽松式许可证表明你授予任何人以任何方式使用、编辑和重新发布你的代码的权利,包括将你的代码作为商业软件的一部分。常见的这类许可证包括MIT 许可证和BSD 许可证。SciPy 社区采用的是新BSD(又称“修正BSD”或“三条款BSD”)许可证。使用这种许可证意味着接受各种人员贡献的代码,包括工业界和创业公司的代码。 copy-left 许可证也允许他人使用、编辑和重新发布你的代码。但是,这种许可证还规定衍生代码必须用copy-left 许可证发布。通过这种方式,copy-left 许可证对代码的用途进行了限制。 最常见的copy-left 许可证是GPL(GNU Public License)。使用copy-left 许可证的最大问题是,经常会使那些来自于私人部门的潜在用户和贡献者无法使用你的代码,甚至包括未来的你!这会严重削减你的用户基础,进而影响软件取得的成就。在科学界,这就意味着更少的引用数。 如果想在许可证的选择方面获得更多帮助,可以看一下Choose a License 这个网站。如果从科研角度考虑,我们推荐你看一下Jake VanderPlas 的博文“The Whys and Hows of Licensing Scientific Code”,他是华盛顿大学自然科学研究主任,不折不扣的SciPy 超级明星。实际上,Jake 的这段话非常清楚地解释了软件许可制度: ……如果你想从这篇文章中总结出3 条信息,那么就是以下3 条。 (1) 一定要对代码进行许可。未许可的代码是封闭代码,因此任何开放许可都优于没有许可(见第2 条)。 (2) 一定要使用GPL 兼容的许可证。GPL 兼容许可证可以确保你的代码具有广泛的兼容性,这种许可证包括GPL、新BSD 以及其他一些许可证(见第3 条)。 (3) 一定要使用宽松式的、BSD 风格的许可证。相比于GPL 或LGPL 这样的copy-left 许可证,更应该使用新BSD 或MIT 这样的宽松式许可证。 本书中的所有代码都具有三条款BSD 许可证。其中包括来自于他人的源代码片段,这些代码通常具有某种宽松式开放许可(尽管不一定是BSD)。 对于你自己的代码,我们建议你遵循社区的做法。例如,Python 科学应用中使用的是三条款BSD 许可证,但R 语言社区采用的则是GPL 许可证。 GitHub:实现社交化编码 前面讨论过了使用开源许可证发布源代码,这样做很可能会促进大量人员下载并使用你的代码,修改其bug 并添加新的功能。你应该将代码放在何处,以便人们找到它呢? bug 修改和新功能如何补充到代码中呢?如何跟踪这些问题和变更呢?可以想象,如果没有有效的管理手段,这些问题很快就会失控。 答案就是:GitHub。 GitHub 是一个用于托管、分享和开发代码的网站,它是建立在版本控制软件Git 基础之上的。一些非常出色的资源可以供你学习如何使用GitHub,比如Peter Bell 和Brent Beer 合著的Introducing GitHub。因为SciPy 生态系统中的绝大多数项目都托管在GitHub 上,所以学习一下它的使用方法是很有必要的。 GitHub 对开源代码的贡献起到了巨大的推进作用,它允许用户发布代码并自由协作。任何人都可以复制一份代码(称为fork)并修改其核心内容,然后创建一个pull request 将修改贡献给原来的代码。GitHub 中有一些非常贴心的特性,比如管理问题和变更请求,以及确定谁可以直接修改你的代码。你甚至可以跟踪修改、贡献者和其他有趣的统计信息。GitHub 还有很多其他精彩特性,但我们要将大部分留给你自己去发现,本书后面会涉及其中一些特性。从本质上讲,GitHub 使软件开发变得更加大众化(见图P-1),大大降低了入门的门槛。 图P-1:GitHub 的影响(经作者Jake VanderPlas 授权使用) 为SciPy生态系统贡献你的力量 如果积累了更多SciPy 经验并开始用它进行科学研究,你可能会发现某个包缺少你需要的功能,也可能认为自己的程序更高效,还可能发现某个程序的bug。如果你达到了这个程度,那么就可以开始为SciPy 生态系统贡献力量了。 我们强烈建议你做这件事。社区能够生存发展,就是因为人们乐于分享自己的代码和改进现有的代码。聚沙成塔,集腋成裘。除去无私的贡献精神外,贡献代码还能获得一些非常实际的个人利益。积极地参与社区可以让你成为一名更加优秀的程序员,你贡献的任何代码都会被其他人审查和反馈意见。你还可以学会如何使用Git 和GitHub,它们是维护和分享代码的非常有用的工具。你甚至还会发现,与SciPy 社区互动会为你构建一个更加广阔的科研网络,并提供意想不到的工作机会。 我们希望你不只是一位SciPy 用户。你加入的是一个社区,你的工作会为它锦上添花,使所有从事科学编程的人员受益匪浅。 Python中的一些恶搞 如果你担心SciPy 社区对新手来说是一个充满压力的地方,那大可不必,因为这个社区是由与你非常相似的人员组成的,都是一些科研工作者,他们通常具有很强的幽默感。 在Python 世界中,你肯定会发现一些与巨蟒喜剧团(Monty Python)有关的梗。Airspeed Velocity 4 是一个测量软件速度的包(后面会做更多介绍),其中就引用了《巨蟒与圣杯》中的一句台词:“一只没有衔任何东西的燕子的飞行速度是多少?” 另一个有着搞笑名称的包是Sux,它允许你在Python 3 环境中使用Python 2 的包。这是使用新西兰口音对six 包的恶搞,这个包允许你在Python 2 中使用Python 3 的语法。转换到Python 3 后,Sux 语法可以让你在使用那些仅用于Python 2 的包时不那么沮丧。 import sux p = sux.to_use('my_py2_package') 一般来说,Python 库的名字都起得十分绚丽,希望你能想出一些这样的名字! 获取帮助 当遇到困难时,我们做的第一件事就是到网上搜索自己要完成的任务或收到的出错信息。这就要用到Stack Overflow,一个关于编程的非常出色的问答网站。如果没有立刻找到所需的内容,可以试着扩充一下搜索条件,找到与你有同样问题的人。 有时你可能是第一个遇到这种问题的人(尤其是使用一个新包时),这时也不要惊慌失措!正如前面所说,SciPy 社区用户是一帮非常友好的家伙,他们分布在互联网的各个地方。接下来你应该做的就是搜索<library name> mailing list,找到相应的邮件列表来寻求帮助。库的作者和高级用户经常阅读邮件列表,而且对新人非常热情。注意,需要先订阅邮件列表,然后才能发邮件,这是一种基本礼仪。否则,在允许你的邮件出现在邮件列表前,经常需要有人手动检查它是否为一封垃圾邮件。有时加入一个邮件列表会令人厌烦,但我们强烈推荐你使用它,它绝对是一个学习的好地方! 注4: 中文意思是“飞行速度”。——编者注 安装Python 本书假设你安装了Python 3.6(或更新的版本)和本书需要的所有SciPy 包。在随书数据中,我们还包括了一个environment.yml 文件,并在其中列出了所有需要的包及其版本。获得全部所需包的最简单方式是先安装conda,它是一个管理Python 环境的工具,然后再将environment.yml 文件传给conda,以便一次性安装所有包的正确版本。 conda env create --name elegant-scipy -f path/to/environment.yml source activate elegant-scipy 访问本书的GitHub 仓库以获取更多细节。 获取随书资料 本书的所有代码和数据都可以在GitHub 仓库(https://github.com/elegant-scipy/elegant-scipy) 中找到。在该仓库的README 文件中,你会发现根据markdown 源文件建立Jupyter 笔记本的相关指导。建立了Jupyter 笔记本之后,你就可以使用仓库中的数据交互式地运行它们。 我们开始吧 本书综合了SciPy 社区提供的一些最优雅的代码。在学习的过程中,我们还会介绍SciPy 社区解决的一些实际科学问题。本书还会带你了解一个期待你加入其中的热情的、协作式的科学编程社区的面貌。 欢迎阅读本书。 排版约定 本书将使用如下排版约定。 黑体 表示新术语或重点强调的内容。 等宽字体(constant width) 表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键词等。 加粗等宽粗体(constant width bold) 表示应该由用户输入的命令或其他文本。 等宽斜体(constant width italic) 表示应该由用户输入的值或根据上下文确定的值替换的文本。 该图标表示提示或建议。 该图标表示一般注记。 该图标表示警告或警示。 使用颜色 本书中的一些示例使用了不同的颜色,但纸质书中是看不出颜色的。你可以查看https:// github.com/elegant-scipy/elegant-scipy 中的原版电子书。 使用代码示例 本书的附加资料(示例代码、练习题等)可以从https://github.com/elegant-scipy/elegant-scipy 下载。5 本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无须联系我们获得许可。比如,用本书的几个代码片段写一个程序就无须获得许可,销售或分发O’Reilly 图书的示例光盘则需要获得许可;引用本书中的示例代码回答问题无须获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。 我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和ISBN。比如,“Elegant SciPy by Juan Nunez-Iglesias, Stéfan van der Walt, and Harriet Dashnow (O’Reilly). Copyright 2017 Juan Nunez-Iglesias, Stéfan van der Walt, and Harriet Dashnow, 978-1-491-92287-3”。 如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过permissions@oreilly. com 与我们联系。 O’Reilly Safari Safari(原来叫Safari Books Online)是一个会员制的培训和参考平台,面向企业、政府、教育从业者和个人。 注5: 也可以访问本书图灵社区页面(http://www.ituring.com.cn/book/2078),下载本书示例代码及彩图,并提交中文版勘误。——编者注 会员可以访问几千种图书、培训视频、学习路径、互动式教程和精选播放列表,提供这些资源的出版商超过250 家,包括O’Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology,等等。 要获得更多信息,请访问http://oreilly.com/safari。 联系我们 请把对本书的评价和问题发给出版社。 美国: O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中国: 北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035) 奥莱利技术咨询(北京)有限公司 对于本书的评论和技术性问题,请发送电子邮件到:bookquestions@oreilly.com 要了解更多O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:http://www. oreilly.com 我们在Facebook 的地址如下:http://facebook.com/oreilly 请关注我们的Twitter 动态:http://twitter.com/oreillymedia 我们的YouTube 视频地址如下:http://www.youtube.com/oreillymedia 致谢 我们必须向为本书做出重要贡献的众多人员致以诚挚的谢意,没有他们的帮助,我们根本不可能完成本书。 首先,感谢NumPy、SciPy 及其相关库的众多贡献者,希望本书能真正体现出你们无与伦比的工作。 其次,感谢更广泛的Python 科学生态系统中的贡献者,包括为本书若干章提供程序基础的人:Vighnesh Birodkar、Matt Rocklin 和Warren Weckesser。由于出版时间的关系,有些贡献者提供的内容没有出现在本书中,我们也必须向你们表示感谢,你们的工作启发了我们,希望本书未来的版本中能够包含你们的工作。我们还要感谢Nicolas Rougier 提供了很多建议,我们将这些建议放在了示例和练习中。 还有很多人提供了数据和代码,为我们节省了大量搜索和探查的时间。感谢Lav Varshney 提供的用于蠕虫大脑光谱图布局的MATLAB 源代码(第3 章和第6 章),以及Stefano Allesina 提供的St. Marks 食品网站数据(第6 章)。 非常感谢在本书出版前做出更正和提出建议的人们,包括Bill Katz、Matthias Bussonnier 和Mark Hyun-ki Kim。 还要感谢我们的技术审阅人,Thomas Caswell、Nelle Varoquaux、Lav Varshney 和Greg Wilson,他们从繁忙的工作中挤出时间为我们梳理草稿,并无私地分享了他们的专业知识。 尽管我们会根据读者的意见继续修订和改进本书,但一些朋友和家人对本书的早期版本进行了校对,并提供了宝贵的意见、建议和鼓励,这让我们受益良多。Malcolm Gorman、Alicia Oshack、PW van der Walt、Simon Kocbek、Nelle Varoquaux 和Ariel Rokem,谢谢你们。 当然,还要感谢O’Reilly 出版社的编辑Meg Blanchette、Brian MacDonald 和Nan Barber。我们要特别感谢Meg,她最先接触我们,洽谈本书的出版事宜,并在我们还一头雾水的时候给出了非常有价值的早期指导意见。 电子书 扫描如下二维码,即可购买本书电子版。

>Python科学计算最佳实践:SciPy指南

Python科学计算最佳实践:SciPy指南
作者: [澳]胡安•努内兹-伊格莱西亚斯, [美]斯特凡•范德瓦尔特, [澳]哈丽雅特•达士诺
isbn: 7115499128
书名: Python科学计算最佳实践:SciPy指南
页数: 228
译者: 陈光欣
定价: 69.00元
出版社: 人民邮电出版社
出版年: 2019-1
装帧: 平装