《机器学习系统设计:Python语言实现》一2.4 NumPy

2.4 NumPy

我们应该知道Python中表示数据的类型层次。类型层次的根是不可变对象,例如整数、浮点数和布尔。基于这些类型,我们有序列类型。序列类型是有序的对象集合,并且由非负整数进行索引。序列类型是可遍历对象,包括字符串、列表和元组。序列类型有一组共同的操作,例如返回一个元素(s[i])或分片(s[i:j])、求长度(len(s))或求和(sum(s))。最后还有映射类型。映射类型是由一组关键字对象索引的对象集合。映射对象是无序的,并且由数字、字符串或其他对象索引。Python内置的映射类型是字典。
NumPy在这些数据对象的基础之上提供了两类对象:N维数组对象(ndarray)和通用函数对象(ufunc)。ufunc对象为ndarray对象提供了基于元素的操作,允许类型映射和数组广度映射(broadcasting)。类型映射是将数据类型改变为其他类型的过程,也可称为类型转换,广度映射描述了不同大小的数组是如何进行算术运算处理的。NumPy还包括如下子包:线性代数(linalg)、随机数生成器(random)、离散傅里叶变换(fft)和单元测试(testing)。
NumPy使用dtype对象来描述数据的各个方面。这包括诸如浮点数、整数等数据的类型,数据类型的字节数(如果数据是结构化的),以及字段的名字和任意子数组(阵列)的阵形。NumPy还包括如下一些新的数据类型:
8位、16位、32位和64位的整型
16位、32位、64位的浮点数
64位和128位的复数类型
ndarray结构化数组类型
我们可以使用np.cast对象在类型之间进行转换。该对象实际上是一个字典,其键值是目标转换类型,其值是相应的转换函数。如下代码所示,我们可以将整数转换为float32:

NumPy数组有多种创建方法,例如由其他Python数据结构转换为数组,使用诸如arange()、ones()和zeros()等内嵌的数组创建对象,或者由.csv或.html文件进行创建。
Indexing和slicingNumPy分别建立于索引和分片技术,并应用于序列。我们应该对序列分片已经很熟悉了,例如对于列表和元组,在Python中使用[i:j:k]语法,其中i是开始索引,j是结束索引,k是步长。NumPy将这种选择元组的概念扩展为N维。
输入如下命令,激活Python控制台:

我们可以看到如下输出:

其输出是一个3维、4维、5维的多维数组。你应该知道,我们可以通过例如[2,3,4]的表示法来访问数组中的每个元素,[2,3,4]会返回59。数组的索引由0开始。
我们可以使用分片技术返回数组的一个分片。
A[1:2:]得到如下数组:

使用(…),我们可以选择保留任意维度的数组元素。例如,a[…,1]等同于a[:,:,1]:

我们还可以使用负数从数组末端开始计数:

通过分片,我们可以创建数组的视图,而原始数组保持不变,视图持有原始数组的引用。也就是说,创建了分片之后,即使将其分配给一个新的变量,但如果我们改变了原始数组,这些变化也会反映在新的数组变量中。下图进行了举例说明:

这里的a和b都引用了同一数组。当我们分配a中的值,也会同时在b中反映。如果不仅仅是引用数组,而是对其进行复制,我们需要使用标准库中copy包的deepcopy()函数。

这里,我们创建了一个独立的数组变量c,此时,数组a中的任何变化都不会反映在数组c中。

2.4.1 构造和变换数组

作为构造数组的一种有效手段,NumPy的多个类都使用了分片功能。例如,numpy.mgrid可以用分片来创建meshgrid对象,这在特定情况下比使用arange()更为便利。其主要目的是建立指定维度的N维坐标系数组矩阵。如下图中的例子所示:

有时,我们需要以其他方式来操作数据,这包括:
连接:通过使用np.r_和np.c_函数,我们可以使用分片结构连接一个或两个数轴(axis),例如:

这里我们使用复数5j作为步长,Python将其解释为填充数轴指定范围内点的数量,这里的范围是-1到1,并包含范围边界值。
newaxis:该对象扩展了数组的维度。

上例扩展了数组a的维度,在第一维度增加了额外的数轴。下例则在第二维度增加了新的数轴:

我们还可使用布尔运算符进行过滤:

对指定数轴进行求和:

这里我们指定数轴为2进行了求和。

2.4.2 数学运算

正如所希望的那样,我们可以对NumPy数组运行如加法、减法、乘法,甚至三角函数等数学运算。我们还可以通过广度映射(broadcasting)对不同阵形的数组进行算术运算。当对两个数组进行运算时,NumPy会从尾部维度开始根据元素来比较阵形,如果二者维度相等或其中之一为1,则认为二者兼容,如果不兼容,则会抛出ValueError异常。
运算实际上是由ufunc对象完成的。该对象会对ndarrays的逐个元素进行操作。这些对象本质上是封装器,为标量函数提供了一致的接口,以使其能够对NumPy数组进行操作。NumPy有超过60个ufunc对象,广泛覆盖了各种运算和类型。在运行运算时,ufunc对象是被自动调用的,例如,当对两个数组使用+运算符运行加法运算时,会自动调用相应的ufunc对象。
此外还有一些额外的数学特征如下所述:
向量(Vectors):我们也可以使用np.vectorize()函数创建标量函数的向量化版本。该函数以Python的scalar函数或方法作为参数,输出该函数的向量化版本。

我们可以观察到如下输出:

多项式函数(Polynomial functions):poly1d类允许我们以一种自然的方式来处理多项式函数。它接受降幂顺序的系数数组为参数。例如,可以按如下方式输入多项式2x2 + 3x + 4:

我们可以看到上例中以人类可读方式打印输出了多项式。我们还可以对多项式进行各种运算,例如对给定点进行求值:

求根:

我们可以使用asarray(p)将多项式系数赋值为一个数组,这样就能在所有接受数组参数的函数中使用了。
正如我们所见,NumPy的这些包为机器学习提供了强大而灵活的框架。

时间: 2024-10-22 07:27:45

《机器学习系统设计:Python语言实现》一2.4 NumPy的相关文章

Python语言下的机器学习库

Python是最好的编程语言之一,在科学计算中用途广泛:计算机视觉.人工智能.数学.天文等.它同样适用于机器学习也是意料之中的事. 当然,它也有些缺点;其中一个是工具和库过于分散.如果你是拥有unix思维(unix-minded)的人,你会觉得每个工具只做一件事并且把它做好是非常方便的.但是你也需要知道不同库和工具的优缺点,这样在构建系统时才能做出合理的决策.工具本身不能改善系统或产品,但是使用正确的工具,我们可以工作得更高效,生产率更高.因此了解正确的工具,对你的工作领域是非常重要的. 这篇文

sklearn:Python语言开发的通用机器学习库

引言:深入理解机器学习并完全看懂sklearn文档,需要较深厚的理论基础.但是,要将sklearn应用于实际的项目中,只需要对机器学习理论有一个基本的掌握,就可以直接调用其API来完成各种机器学习问题. 本文选自<全栈数据之门>,将向你介绍通过三个步骤来解决具体的机器学习问题. sklearn介绍 scikit-learn是Python语言开发的机器学习库,一般简称为sklearn,目前算是通用机器学习算法库中实现得比较完善的库了.其完善之处不仅在于实现的算法多,还包括大量详尽的文档和示例.其

机器人系统设计与制作:Python语言实现2.5 用Blender制作机器人的三维模型

2.5 用Blender制作机器人的三维模型 在这一节中,我们将设计机器人的3D模型.3D模型主要用来进行三维仿真,采用Blender工具软件进行建模.Blender的版本必须要在V2.6以上,目前我们只在V2.6以上版本中测试过. Blender软件主界面上的工作空间和用于3D建模的工具栏如图2-14的屏幕截图所示. 我们选择用Blender这个工具的主要原因是,它可以用Python脚本语言进行机器人的3D建模.Blender有一个内置的Python解释器和脚本编辑器,用于代码编写.这里,我们

机器人系统设计与制作:Python语言实现2.1 服务机器人的设计需求

摘要 服务机器人的机械设计 本书的主要目的是通过设计和构建机器人,并使用Python语言对它进行编程实现来学习机器人技术.我们先来看看如何从零开始对机器人的机械结构进行设计.我们将要设计搭建的是一种服务机器人,它将用于酒店和餐馆为顾客提供食物和饮料. 在本章中,我们可以看到这个机器人将使用的各种各样的机械零部件.同时,还将学到如何组装这些机械零部件.我们可以使用CAD软件工具来设计和装配这些零部件,同时搭建一个机器人的3D模型进行模拟仿真. 酒店里使用的机器人一般会比较大,但在这里我们打算搭建一

强者联盟——Python语言结合Spark框架

引言:Spark由AMPLab实验室开发,其本质是基于内存的快速迭代框架,"迭代"是机器学习最大的特点,因此非常适合做机器学习.得益于在数据科学中强大的表现,Python语言的粉丝遍布天下,如今又遇上强大的分布式内存计算框架Spark,两个领域的强者走到一起,自然能碰出更加强大的火花(Spark可以翻译为火花),因此本文主要讲述了PySpark. 本文选自<全栈数据之门>. 全栈框架 Spark由AMPLab实验室开发,其本质是基于内存的快速迭代框架,"迭代&qu

数据科学和机器学习工具和语言最新动态

文章讲的是数据科学和机器学习工具和语言最新动态,第18届年度KDnuggets软件投票又一次受到了分析.数据科学界和软件生产商的热情参与.与去年相似,约有2900人参与了此次投票.最近几年,Python的使用增长率一直比R快,到今年,Python终于以微弱的优势超过了R的使用率 (52.6% Vs 52.1%).然而最大的惊喜应该是深度学习工具的广泛共享和使用.2017年深度学习有32%的使用率,而在2016年只有18%,2015年9%.谷歌Tensorflow迅速成为深度学习平台的领头者,以2

Linux集群和自动化维3.1 Python语言的应用领域

第3章 轻量级自动化运维工具Fabric详解 近期公司的业务系统代码发布频繁,笔者同时在几个项目组里面穿插工作,发现发布和运维的工作都相当机械,加上频率比较高,导致时间的浪费也比较多.很多测试工作,例如通过SSH登录到测试环境,推送代码,然后修改Bug进行测试,这些操作都是非常机械并且具有重复性的.更让人郁闷的是,每次的操作都是相同的,命令基本上都是一样的,并且是在多台机器上执行,很难在本机上以一个脚本来搞定,主要时间都浪费在使用SSH登录和输入命令上了.这个时候需要一个轻量级的自动化运维工具,

《基于ArcGIS的Python编程秘笈(第2版)》——第1章 面向ArcGIS的Python语言基础

第1章 面向ArcGIS的Python语言基础 同其他编程语言一样,Python也支持多种类型的程序架构.本章主要介绍Python的基本语言架构.首先,介绍如何创建新的Python脚本及编辑已有的脚本:其次,介绍Python语言的特点,如添加注释.创建变量并赋值.创建内置变量等,以使Python的代码更加简单明了. 然后,介绍Python语言提供的各种内置数据类型,如字符串.数字.列表和字典等.类和对象是Python等面向对象编程语言的基本概念,在使用ArcGIS编写地理处理脚本时会经常用到它们

Python语言在未来的发展前景

做了JAVA开发十年,也做过大大小小的项目,最近一两年做开发的被一门编程语言,也就是Python给刷屏了,在各个论坛中,关注圈中,Python的关注量一直都是很高,今天小编给大家聊一下学习Python语言可以发展哪些方向以及Python语言在未来的发展. 首先:Python语言在学术上非常受欢迎,不是计算机专业的人,很多都在学习Python.因为这个语言的前景是不可限量的,而且他的语法非常的简单易懂,这就让很多一些提及编程就恐慌的人减去了担心,现在已经是一人应该掌握一门编程语言的时代,很多不是程

《从问题到程序:用Python学编程和计算》——1.2 Python语言简介

1.2 Python语言简介 本节将首先简单介绍Python语言的一些基本情况,包括其发展和使用的情况.而后介绍Python语言系统的安装和使用方面的基本常识.1.2.1 Python语言的发展和应用 Python语言是CWI(荷兰国家数学和计算机研究中心)的程序员Guido van Rossum在1989年开始开发的一种高级编程语言,当时的主要设计目标是希望能用于方便地管理CWI的Amoeba操作系统.后来,由于其各方面的优点而逐渐流行起来. Python语言现在由Python软件基金会(Py