NumPy提供了迭代器对象NumPy.nditer,是一个高效的多维迭代器对象,可以使用它对数组进行迭代,使用Python的标准迭代器接口访问数组元素。

示例

import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("打印数组:")
print(a); print("\n")
print("数组迭代:")
for x in np.nditer(a):
print(x, end=' ') print("\n")

输出

打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]] 数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3

我们知道,numpy中的数组排序有两种:

  • F(Fortran)风格顺序,列排序
  • C(C语言)风格顺序,行排序

默认情况下,迭代顺序通常受数组的内存布局影响,不受特定的数组排序(C风格顺序/F风格顺序)影响。

可以看一下把上面示例中的数组转置后,对其进行迭代时的顺序。

示例

比较数组及其转置数组的迭代顺序:

import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("打印数组:")
print(a)
print("\n") print("打印数组的转置:")
at = a.T
print(at) print("\n数组迭代:")
for x in np.nditer(a):
print(x, end=' ') print("\n") print("\n转置的数组迭代:")
for x in np.nditer(at):
print(x, end=' ') print("\n")

输出


打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]] 打印数组的转置:
[[ 1 2 10]
[ 2 4 20]
[ 3 5 39]
[ 4 6 3]] 数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3 转置的数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3

可以看到,这两个迭代顺序是一样的,转置没有影响迭代顺序。

迭代顺序

要强制按F排序或C排序的顺序迭代数组,可在创建迭代对象时显式指定。

示例

import numpy as np  

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  

print("\n打印数组:\n")  

print(a)  

print("\n打印数组的转置:\n")
at = a.T print(at) print("\n迭代转置后的数组\n") for x in np.nditer(at):
print(x, end= ' ') print("\n按C风格顺序迭代数组:\n")
for x in np.nditer(at, order = 'C'):
print(x,end=' ')

输出


打印数组: [[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]] 打印数组的转置: [[ 1 2 10]
[ 2 4 20]
[ 3 5 39]
[ 4 6 3]] 迭代转置后的数组 1 2 3 4 2 4 5 6 10 20 39 3 按C风格顺序迭代数组: 1 2 10 2 4 20 3 5 39 4 6 3

数组修改

迭代数组时,默认数组值不能修改,因为迭代对象的op-flag默认被设置为只读。如要可修改,可在创建迭代对象时,把op_flags设置为readwritewrite

示例

import numpy as np  

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  

print("\n打印原始数组:\n")  

print(a)  

print("\n遍历修改后的数组:\n")  

for x in np.nditer(a, op_flags = ['readwrite']):
x[...] = 3 * x;
print(x,end = ' ')

输出

打印原始数组:

[[ 1  2  3  4]
[ 2 4 5 6]
[10 20 39 3]] 遍历修改后的数组: 3 6 9 12 6 12 15 18 30 60 117 9

广播迭代

如果两个数组是可广播的,可以使用组合的nditer对象对它们进行并发迭代。假设一个数组a的维数为3X4,而另一个数组b的维数为1X4,可使用以下类型的迭代器(将数组b广播到a的大小)。

示例

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4) print ('数组a:')
print (a)
print ('\n') print ('数组b:')
b = np.array([1, 2, 3, 4], dtype = int)
print (b)
print ('\n') print ('同时迭代2个可广播的数组:')
for x,y in np.nditer([a,b]):
print ("%d:%d" % (x,y))

输出

数组a:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 数组b:
[1 2 3 4] 同时迭代2个可广播的数组:
0:1
5:2
10:3
15:4
20:1
25:2
30:3
35:4
40:1
45:2
50:3
55:4

NumPy 数组迭代的更多相关文章

  1. numpy 数组迭代Iterating over arrays

    在numpy 1.6中引入的迭代器对象nditer提供了许多灵活的方式来以系统的方式访问一个或多个数组的所有元素. 1 单数组迭代 该部分位于numpy-ref-1.14.5第1.15 部分Singl ...

  2. NumPy 数组切片

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...

  3. NumPy 数组创建

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...

  4. Numpy数组对象的操作-索引机制、切片和迭代方法

    前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法.使用索引和切片的方法选择元素,还有如何数组的迭代方法. 一.索引机制 1.一维数组 In [1]: a = np.arange ...

  5. 8、numpy——数组的迭代

    1.单数组的迭代 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 1.1 默认迭代顺序 import ...

  6. 操作 numpy 数组的常用函数

    操作 numpy 数组的常用函数 where 使用 where 函数能将索引掩码转换成索引位置: indices = where(mask) indices => (array([11, 12, ...

  7. NumPy 超详细教程(1):NumPy 数组

    系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 文章目录 Numpy 数组:n ...

  8. Numpy 数组操作

    Numpy 数组操作 Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 修改数组形状 函数 描述 resh ...

  9. 玩转NumPy数组

    一.Numpy 数值类型 1.前言:Python 本身支持的数值类型有 int(整型, long 长整型).float(浮点型).bool(布尔型) 和 complex(复数型).而 Numpy 支持 ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:将页面元素所包含的文本内容替换为背景图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. python 开启http服务并下载文件

    Python <= 2.3python -c "import SimpleHTTPServer as s; s.test();" 8000 Python >= 2.4p ...

  3. 对于java多态的总结

    父类引用指向子类对象是Java比较基础的概念.Java作为一门面向对象编程的语言,调用对象是在编程中经常用到的.尚学堂李老师为大家详细说明这一概念. 例如父类Animal,子类Cat,Dog.其中An ...

  4. 「SCOI2009」windy数

    传送门 Luogu 解题思路 数位 \(\text{DP}\) 设状态 \(dp[now][las][0/1][0/1]\) 表示当前 \(\text{DP}\) 到第 \(i\) 位,前一个数是 \ ...

  5. IdentityServer4专题之一:OAuth2.0介绍

    1.OAuth 2.0授权方式介绍: OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么: OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有 ...

  6. Unity添加小米游戏SDK

    因为游戏要上线小米的平台,所以游戏就要添加小米SDK,整了3天总算是把小米SDK添加上了~~ 多亏找到了这个帖子:Unity3D接入小米盒子SDK. (小米人家论坛有官方贴出来的其他开发者的接入经验~ ...

  7. 内核MKDEV(MAJOR, MINOR)

    版本:linux-2.6.24.4 宏: MKDEV(MAJOR, MINOR);   说明: 获取设备在设备表中的位置. MAJOR   主设备号 MINOR   次设备号     内核使用的版本号 ...

  8. greenplum 存储过程 索引信息

    涉及的索引表 参考:http://blog.nbhao.org/1539.html pg_index pg_indexes pg_stat_all_indexes # 记录当前数据库中所有的索引的使用 ...

  9. GoJS实例4

    此示例更改链接数据的“to”属性,使链接连接到不同的节点.复制如下内容保存到空白的.html文件中,用浏览器打开即可查看效果 <!DOCTYPE html> <html> &l ...

  10. wdcp升级php5.8到php7.1.12后安装redis

    一.安装redis a.下载redis: redis最新稳定版下载http://www.redis.io/download wget http://download.redis.io/releases ...