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

示例

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

输出

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

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

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

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

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

示例

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

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

输出


  1. 打印数组:
  2. [[ 1 2 3 4]
  3. [ 2 4 5 6]
  4. [10 20 39 3]]
  5. 打印数组的转置:
  6. [[ 1 2 10]
  7. [ 2 4 20]
  8. [ 3 5 39]
  9. [ 4 6 3]]
  10. 数组迭代:
  11. 1 2 3 4 2 4 5 6 10 20 39 3
  12. 转置的数组迭代:
  13. 1 2 3 4 2 4 5 6 10 20 39 3

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

迭代顺序

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

示例

  1. import numpy as np
  2. a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
  3. print("\n打印数组:\n")
  4. print(a)
  5. print("\n打印数组的转置:\n")
  6. at = a.T
  7. print(at)
  8. print("\n迭代转置后的数组\n")
  9. for x in np.nditer(at):
  10. print(x, end= ' ')
  11. print("\n按C风格顺序迭代数组:\n")
  12. for x in np.nditer(at, order = 'C'):
  13. print(x,end=' ')

输出


  1. 打印数组:
  2. [[ 1 2 3 4]
  3. [ 2 4 5 6]
  4. [10 20 39 3]]
  5. 打印数组的转置:
  6. [[ 1 2 10]
  7. [ 2 4 20]
  8. [ 3 5 39]
  9. [ 4 6 3]]
  10. 迭代转置后的数组
  11. 1 2 3 4 2 4 5 6 10 20 39 3
  12. C风格顺序迭代数组:
  13. 1 2 10 2 4 20 3 5 39 4 6 3

数组修改

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

示例

  1. import numpy as np
  2. a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
  3. print("\n打印原始数组:\n")
  4. print(a)
  5. print("\n遍历修改后的数组:\n")
  6. for x in np.nditer(a, op_flags = ['readwrite']):
  7. x[...] = 3 * x;
  8. print(x,end = ' ')

输出

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

广播迭代

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

示例

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

输出

  1. 数组a:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5. 数组b:
  6. [1 2 3 4]
  7. 同时迭代2个可广播的数组:
  8. 0:1
  9. 5:2
  10. 10:3
  11. 15:4
  12. 20:1
  13. 25:2
  14. 30:3
  15. 35:4
  16. 40:1
  17. 45:2
  18. 50:3
  19. 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. 病毒[POI2000](AC自动机+搜索)

    题目链接:病毒[POI2000] 我们假设已经有一个无限长的串满足要求,那如果我们拿它去匹配会发生什么? 它会一直在Trie树和fail树上转圈,一定经过根节点且不会经过病毒字符串结束的节点. 所以如 ...

  2. DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. The AcquireConnection method call to the connection manager "XXX" failed with error code 0xC0209303.

    问题: 今天写了一个新的SSIS的ETL包,运行报如下错误. DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. The AcquireConnec ...

  3. Windows驱动开发-Device结构体

    每个驱动程序会创建一个或多个设备对象,每个设备对象都会有一个指针指向下一个设备对象 Device结构体源码 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATIO ...

  4. 伪奢侈品iPhone大降价,肉搏国产手机胜算几何?

    据国外媒体报道,苹果在中国降低iPhone价格的策略已收到明显的效果,自从1月11日正式调整价格以来,iPhone在苏宁电器平台上的销量飙升83%,而天猫上的销量也增长了76%,其中最受欢迎的机型是i ...

  5. jQuery父级以及同级元素查找的实例

    父级以及同级元素的查找在使用过程中还是蛮频繁的,下面为大家介绍下jQuery是如何实现的,感兴趣的朋友可以参考下 jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$( ...

  6. centos6忘记root密码

    Centos6 1.在开机时不要自动进入系统,按任意键进入GRUB引导菜单 2.按E键进入编辑模式 3.选中kernel选项继续按E键 4.在结尾处添加single关键字后按ENTER保存退出 5.之 ...

  7. 连续(Continuity) - 有界(Bounded) - 收敛(Convergence)

    连续(Continuity) 所有点连续   ->   一致连续 (uniform continuity)  ->  绝对连续  -> 李普希兹连续(Lipschitz) 弱    ...

  8. redis的基本操作

    redis是key-value的数据结构,每条数据都是⼀个键值对 键的类型是字符串 注意:键不能重复 值的类型分为五种: 字符串string 哈希hash 列表list 集合set 有序集合zset ...

  9. NSQ学习记录

    一.简介 NSQ是一个基于Go语言的开源的分布式实时消息平台,他的代码托管在GitHub上. NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架 ...

  10. 浅析 URL

    浅析 URL 参考于维基百科 URL => Uniform Resource Locator : 统一资源定位符 统一资源定位符的标准格式如下: [协议类型]://[服务器地址]:[端口号]/[ ...