1、单数组的迭代

NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。

迭代器最基本的任务的可以完成对数组元素的访问。

1.1 默认迭代顺序

  1. import numpy as np
  2. a = np.arange(6).reshape(2, 3)
  3. b = a.T # b为a的装置
  4. print('a=', a)
  5. for i in np.nditer(a):
  6. print(i)
  7. print('b=', b)
  8. for i in np.nditer(b):
  9. print(i)

执行结果:

  1. a= [[0 1 2]
  2. [3 4 5]]
  3. 0
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. b= [[0 3]
  10. [1 4]
  11. [2 5]]
  12. 0
  13. 1
  14. 2
  15. 3
  16. 4
  17. 5

注意:通过该种方式迭代输出的是以元素在存储器中的布局顺序输出的,无论其视图做何种改变(转置,变换shape),其输出结果是一致的,该中方式可以提高迭代效率

a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是 a.T.copy(order = 'C') 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问。

1.2 控制迭代的顺序

  • for x in np.nditer(a, order='F'):Fortran order,即是列序优先;

  • for x in np.nditer(a.T, order='C'):C order,即是行序优先;

  1. import numpy as np
  2.  
  3. a = np.arange(0,60,5)
  4. a = a.reshape(3,4)
  5. print ('原始数组是:')
  6. print (a)
  7. print ('\n')
  8. print ('原始数组的转置是:')
  9. b = a.T
  10. print (b)
  11. print ('\n')
  12. print ('以 C 风格顺序排序:')
  13. c = b.copy(order='C')
  14. print (c)
  15. for x in np.nditer(c):
  16. print (x, end=", " )
  17. print ('\n')
  18. print ('以 F 风格顺序排序:')
  19. c = b.copy(order='F')
  20. print (c)
  21. for x in np.nditer(c):
  22. print (x, end=", " )

执行结果:

  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5.  
  6. 原始数组的转置是:
  7. [[ 0 20 40]
  8. [ 5 25 45]
  9. [10 30 50]
  10. [15 35 55]]
  11.  
  12. C 风格顺序排序:
  13. [[ 0 20 40]
  14. [ 5 25 45]
  15. [10 30 50]
  16. [15 35 55]]
  17. 0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55,
  18.  
  19. F 风格顺序排序:
  20. [[ 0 20 40]
  21. [ 5 25 45]
  22. [10 30 50]
  23. [15 35 55]]
  24. 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55,

可以通过显式设置,来强制 nditer 对象使用某种顺序:

  1. import numpy as np
  2.  
  3. a = np.arange(0,60,5)
  4. a = a.reshape(3,4)
  5. print ('原始数组是:')
  6. print (a)
  7. print ('\n')
  8. print ('以 C 风格顺序排序:')
  9. for x in np.nditer(a, order = 'C'):
  10. print (x, end=", " )
  11. print ('\n')
  12. print ('以 F 风格顺序排序:')
  13. for x in np.nditer(a, order = 'F'):
  14. print (x, end=", " )

执行结果:

  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5.  
  6. C 风格顺序排序:
  7. 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55,
  8.  
  9. F 风格顺序排序:
  10. 0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 5

1.3 修改数组中的元素

nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式。

  1. import numpy as np
  2.  
  3. a = np.arange(0,60,5)
  4. a = a.reshape(3,4)
  5. print ('原始数组是:')
  6. print (a)
  7. print ('\n')
  8. for x in np.nditer(a, op_flags=['readwrite']):
  9. x[...]=2*x
  10. print ('修改后的数组是:')
  11. print (a)

执行结果:

  1. 原始数组是:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5.  
  6. 修改后的数组是:
  7. [[ 0 10 20 30]
  8. [ 40 50 60 70]
  9. [ 80 90 100 110]]

2、数组迭代(Iterating over arrays)

该部分内容位于numpy-ref-1.14.5中的3.15.4 Iterating over arrays 章节

numpy.nditer 为高效多维迭代器对象,用于对数组的迭代。

flags:sequence of str ,optional

用于控制迭代器行为的标志(flags)

buffrered - 再需要时可以缓冲

c_index - 跟踪C顺序的索引

f_index - 跟踪F顺序的索引

multi_index - 跟踪 多指标,或每个迭代维度的一组指数

external_loop - 外部循环,将一维的最内层的循环转移到外部循环迭代器,使得numpy的矢量操作在处理更大规模数据时变得更有效率。

op_flags:list of list of str , optional

这是每个操作数的标志列表。至少必须指定一个“只读”、“读写”或“写”。

readonly - 该操作数表明可以读取

readwrite - 该操作数表明可以读取和写入

writeonly - 该操作数表明仅写入

no_broadcast - 该操作数可以防止被广播

copy - 该操作数表明允许临时只读拷贝

op_dtypes:dtype or tuple of dtype(s), optional

操作数所需的数据类型(s)。

order:{‘C’, ‘F’, ‘A’, ‘K’}, optional

控制迭代顺序(Controls the iteration order)

2.1 使用外部循环 external_loop

将一维的最内层的循环转移到外部循环迭代器,使得numpy的矢量化操作在处理更大规模数据时变得更有效率。

  1. a = np.arange(6).reshape(2,3)
  2. print(a)
  3. # [[0 1 2]
  4. # [3 4 5]]
  5. for x in np.nditer(a, flags = ['external_loop']):
  6. print(x)
  7. # [0 1 2 3 4 5]
  8.  
  9. for x in np.nditer(a, flags = ['external_loop'],order = 'C'):
  10. print(x)
  11. # [0 1 2 3 4 5]
  12.  
  13. for x in np.nditer(a, flags = ['external_loop'],order = 'F'):
  14. print(x)
  15. # [0 3]
  16. # [1 4]
  17. # [2 5]

2.2 追踪单个索引或多重索引

  1. a = np.arange(6).reshape(2,3)
  2. print(a)
  3. # [[0 1 2]
  4. # [3 4 5]]
  5. it = np.nditer(a,flags = ['f_index'])
  6.  
  7. while not it.finished:
  8. print("%d <%d>" % (it[0], it.index))
  9. it.iternext()
  10.  
  11. # 0 <0>
  12. # 1 <2>
  13. # 2 <4>
  14. # 3 <1>
  15. # 4 <3>
  16. # 5 <5>

为了更清楚地表述,可以直观地看下表

flags = multi_index

  1. a = np.arange(6).reshape(2,3)
  2. print(a)
  3. # [[0 1 2]
  4. # [3 4 5]]
  5. it = np.nditer(a,flags = ['multi_index'])
  6.  
  7. while not it.finished:
  8. print("%d <%s>" % (it[0], it.multi_index))
  9. it.iternext()
  10. # 0 <(0, 0)>
  11. # 1 <(0, 1)>
  12. # 2 <(0, 2)>
  13. # 3 <(1, 0)>
  14. # 4 <(1, 1)>
  15. # 5 <(1, 2)>

multi_index是将元素的行列位置以元组方式打印出来,但元组形式不是整型,所以要将 %d 变为 %s,

若不改,则会报错 TypeError: %d format: a number is required, not tuple

  1. import numpy as np
  2. a = np.arange(6).reshape(1,2,3)
  3. print(a)
  4. # [[[0 1 2]
  5. # [3 4 5]]]
  6. it = np.nditer(a,flags = ['multi_index'])
  7.  
  8. while not it.finished:
  9. print("%d <%s>" % (it[0], it.multi_index))
  10. it.iternext()
  11. # 0 <(0, 0, 0)>
  12. # 1 <(0, 0, 1)>
  13. # 2 <(0, 0, 2)>
  14. # 3 <(0, 1, 0)>
  15. # 4 <(0, 1, 1)>
  16. # 5 <(0, 1, 2)>

2.3 广播迭代

如果两个数组是 可广播的,nditer组合对象能够同时迭代它们,假设数组 a 具有维度 3*4 ,并且存在维度为 1*4的另一个数组b,则使用以下类型的迭代器(数组b被广播到a的大小)

  1. import numpy as np
  2.  
  3. a = np.arange(0,60,5)
  4. a = a.reshape(3,4)
  5. print ('第一个数组为:')
  6. print (a)
  7. print ('\n')
  8. print ('第二个数组为:')
  9. b = np.array([1, 2, 3, 4], dtype = int)
  10. print (b)
  11. print ('\n')
  12. print ('修改后的数组为:')
  13. for x,y in np.nditer([a,b]):
  14. print ("%d:%d" % (x,y), end=", " )

执行结果:

  1. 第一个数组为:
  2. [[ 0 5 10 15]
  3. [20 25 30 35]
  4. [40 45 50 55]]
  5.  
  6. 第二个数组为:
  7. [1 2 3 4]
  8.  
  9. 修改后的数组为:
  10. 0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
 

8、numpy——数组的迭代的更多相关文章

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

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

  2. numpy 数组迭代Iterating over arrays

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

  3. NumPy 数组迭代

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

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

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

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

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

  6. Numpy 数组操作

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

  7. 玩转NumPy数组

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

  8. Python数据分析之numpy数组全解析

    1 什么是numpy numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于大型.多维数据上执行数值计算. 在NumPy 中,最重要的对象是 ...

  9. Numpy数组操作

    """ Numpy 数组操作 修改数组形状 函数 描述 reshape 不改变数据的条件下修改形状 flat 数组元素迭代器 flatten 返回一份数组拷贝,对拷贝所做 ...

随机推荐

  1. MyBatis联表查询——别名方式

    在使用MyBatis你想工程时,单表操作其实是非常完美的,涉及到多表联合查询时,需要我们自己写联表的SQL语句. 我拿出项目中的部分代码作为示例, EmployeeMapper.xml: <?x ...

  2. jvm监控和诊断工具

    大牛写的Java的OOM Killer:https://www.jianshu.com/p/4645254be259 强烈推荐 总的参考链接:https://cloud.tencent.com/dev ...

  3. 十大热门AI芯片

    资料来源:头条<人工智能影响力报告>中的人工智能十大热门芯片 iPhone X内部搭载了一颗全新定制的处理器——A11 Boinic,用来承担人脸识别和移动支付的工作负荷.双核心A11芯片 ...

  4. Manjaro美化 配置教程

    Manjaro Linux的美化 切换源 sudo vi /etc/pacman.conf 加入arch源 [archlinuxcn] SigLevel = Optional TrustedOnly ...

  5. How to compile and install Linux Kernel 5.1.2 from source code

    How to compile and install Linux Kernel 5.1.2 from source code Compiling a custom kernel has its adv ...

  6. linux7 grub配置文件 linux6 grub配置文件

    在 grub 的 kernel 配置后面,添加 acpi_pad.disable=1 重启机器之后,开机就不会自动加载 acpi_pad 模块 一:linux6 [root@node2 ~]# cat ...

  7. bootstrap模态框模板代码

    模态框模板 模板代码 <!-- 添加员工的模态框 start --> <div class="modal fade" id="empAddModal&q ...

  8. django之重定向redirect

    一:redirect的场景 加入登录成功后,需要跳转到主页:登录退出后,跳转到主页面.

  9. redis专题

    1.Linux安装redis 2.redis持久化 3.redis配置 4.SpringBoot整合Redis发布订阅 5.redis事务 5.1.redis事务介绍 5.2. redisTempla ...

  10. CF1037H Security 后缀自动机 + right集合线段树合并 + 贪心

    题目描述: 给定一个字符串 $S$ 给出 $Q$ 个操作,给出 $L,R,T$,求出字典序最小的 $S_{1}$ 为 $S[L...R]$的子串,且 $S_{1}$ 的字典序严格大于 $T$. 输出这 ...