购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 索引和遍历

本节将会讨论在NumPy中进行ndarray元素的索引。对于一维ndarray矩阵对象,元素的索引方法与Python的列表和元组类似,如表3-5和图3-11所示,同样的,NumPy矩阵对象的索引号也是从0开始。

表3-5 以一维ndarray矩阵对象a为例进行索引

值得注意的是,图3-11所示的例子7和例子8展示了Python列表和元组没有的索引方法。在例子7中a[a>2]只索引了a中元素值大于2的元素。而在例子8中~np.isnan(a)用于索引a中非NaN元素。

图3-11 一维数组切片和索引例子

读者可以使用函数np.where()来实现更多复杂的过滤条件。where()函数的定义如下。

numpy.where(condition[, x, y])

使用where()函数时,根据表达式condition给出的条件,返回表达式 x 或者表达式 y 的值,表达式 x 或者表达式 y 可以不给定。

以下例子展示了如何使用where()函数实现将a中小于5的元素增大0.1,大于5的元素增大0.2。

运行结果如下。

二维ndarray矩阵对象的元素同样可以被索引。在被索引时,需要在方括号中给定元素的行值和列值,具体如图3-12所示。

此外,读者还可以使用take()和put()函数进行更高级的矩阵元素索引和复制。take()和put()函数的优势在于通过索引号直接访问矩阵元素的数值,这些索引号可以是零散的和数量不限的。

如图3-13展示了将take()方法应用在一维向量上,索引后同样是一维向量。如图3-14所示为使用take()方法时,索引号是一个2 × 4的矩阵,索引后获得的同样是一个2 × 4的矩阵。

矩阵对象也可以使用take()方法进行索引。和使用方括号进行索引不同的是,take()方法的索引号不是通过元素所在的行和列给定的,而是沿着行的方向获得。如图3-15所示为一个3 × 4的矩阵如何沿着行的方向获得每个矩阵元素的索引值。

图3-12 二维ndarray矩阵对象索引示例

图3-13 take()方法的应用:原始数据和索引数组都是一维向量

图3-14 take()方法应用:原始数据是一维向量,索引数组是矩阵

图3-15 take()沿着行的方向进行矩阵元素索引

在图3-16(b)中,a.take([2,3,1])可以返回矩阵 a 中的索引位置为2、3和1的元素数值。类似地,图3-16(c)中a.take([12,5,2,9])返回矩阵 a 中索引位置为12、5、2、9的元素。

图3-16 take()方法应用在矩阵上

take()方法中的axis参数可以用来指定索引矩阵的某一行或某一列。如图3-17(b)中的例子所示,a.take([3,1,2], axis =1)可以分别获取矩阵 a 的第三列、第一列和第二列的元素。如图3-18(b)所示a.take([3,1,2], axis =0)则可以获得矩阵 a 的第三行、第一行和第二行的元素。

图3-17 take()方法用于提取矩阵某一列

图3-18 take()方法用于提取矩阵某一行

本节接下来将讨论ndarray元素的迭代。NumPy提供了两种基本的 迭代器 (flatiter iterator),第一种是使用ndarray矩阵对象的属性flat。以下例子展示了这一迭代方法。

上述代码的运行结果如下所示。可以看出使用flat属性作为迭代器时,可以将多维ndarray的所有元素按次序输出。对转置后的ndarray进行迭代后,可发现与对原ndarray进行迭代的结果不同。这个特点和接下来讨论的nditer()函数不同。

nditer()函数用来对ndarray矩阵对象进行迭代或访问其元素。以下代码是使用nditer()函数替换上一个例子中的flat属性。读者运行代码后可发现,运行结果都是:0,1,2,3,4。这是因为nditer()函数只会将元素按照其在内存中存储的次序进行迭代输出。

nditer()函数里提供了参数order,可以用来调整迭代元素的次序。当参数order ='C'时,沿着行方向输出元素,当order ='F'时,沿着列方向输出元素。

上述例子展示了如何使用order参数来调整迭代元素的次序,结果如下所示。如图3-19所示对比了这两种迭代次序的不同。

图3-19 ndarray的元素遍历方式

nditer()函数还可以被用来批量修改ndarray矩阵对象中元素的值。这时需要使用参数op_flags。默认情况下,op_flags ='readonly',这时ndarray中的元素为只读模式。为了实现对元素数值的修改,op_flags需要被设定为readwrite模式,如下例所示。

在这个例子中,迭代遍历ndarray元素值的同时,返回对应的平方值。运行结果如下。 HxH4z/H4qtx29pSqWe1R5zA+Ztnpns00k8l9Vk143pupuyRjnPub6R354ukoX5lm

点击中间区域
呼出菜单
上一章
目录
下一章
×