前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python第三十课:NumPy遍历

Python第三十课:NumPy遍历

作者头像
HuangWeiAI
发布2019-07-29 17:20:46
2.9K0
发布2019-07-29 17:20:46
举报
文章被收录于专栏:浊酒清味浊酒清味

上一课我们学习的是索引NumPy数组的具体元素,包括单个元素索引,范围元素索引以及条件元素索引。这一节课我们尝试用循环的方式,遍历数组中所有元素。考虑到常见的数组往往不止一个维度,因此while和for循环写起来很费事,所以我们有必要学习NumPy自带的遍历方法

01

迭代数组

Numpy自带一个数组迭代器,叫nditer,可以让我们灵活访问数组中元素。最基本的调用方式就是把你的某个数组A放进去nditer()里面:np.nditer(A),然后配合for循环格式就可以遍历整个数组。我们直接用一个例子来展示这种简单的方法。

我们照例创建了一个形状为(3,4)的二维数组A,利用nditer配合for循环的格式,依次迭代访问数组A中的元素。注意到在print函数中,我们给参数end赋值了一个空格字符串,目的是让打印出来的元素可以被空格间隔。可以看一下运行结果:

大家可以尝试一下给end赋值别的字符串,例如逗号,换行等等。

02

控制顺序

在上面一节中,我们发现nditer默认访问数组的顺序是按行优先。事实上,nditer有一个参数来控制遍历顺序。这个参数叫order,有两个值可以选择,如果order='C',那么就会按行优先的顺序访问;如果order='F',那么则会按列顺序优先访问。我们来看个例子:

我们在每次打印nditer前加入print('\n')目的是强行换行,因为在上一个例子中我们给end赋值空格字符串,如果不加入换行就会让打印的内容跑到同一行中。正如我们上面所说,'C'和'F'分别代表行和列优先。值得一提的这里的C,F并不是我们常见的row和column的缩写,而是代码C语言标准格式和Fortran格式,二者都是一种程序语言。

运行结果:

03

修改元素

nditer在遍历数组的时候,给我们提供了一个读写的选项,也就是说,我们根据这个读写开关可以改变数组的数值。这个参数叫做op_flags,默认值是只读模式'read-only',此时不可以修改元素。但是我们可以让op_flags赋值'readwrite' 或者 'writeonly':

我们利用'writeonly'将遍历的读写模式变成只写模式,大家也可以尝试'readwrite'一下看看效果如何。对于每个元素,我们都让它扩大两倍。有一点,我们用了n[...]格式,让乘以两倍后的元素重新赋值回去,[...]不可或缺。

运行结果:

04

外部循环

上面的所有例子都是逐一访问数组中的每个元素,我们还可以一次访问某一个行或者某一列,这时候要 用到external_loop,对应的参数叫flags。配合上控制顺序的参数order就可以一列一列输出或者按行顺序输出:

我们分别尝试了两种顺序的外部循环遍历数组D,F对应列优先顺序,而C对应行优先的顺。有点需要注意就是,F输出的每一列组成一个数组,而C输出的所有元素组成一个数组。

运行结果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浊酒清味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档