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. project clean

    1.由于eclipse的编译是基于时间戳的判断机制的.因此当你按build all的时候有些eclipse认为时间戳没有改变的类不会被编译.因此你可以先clean一下再编译.这个时候eclipse会将 ...

  2. 【转】彻底搞透Netty框架

    本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序 ...

  3. 吴裕雄--天生自然HADOOP操作实验学习笔记:单节点伪分布式安装

    实验目的 了解java的安装配置 学习配置对自己节点的免密码登陆 了解hdfs的配置和相关命令 了解yarn的配置 实验原理 1.Hadoop安装 Hadoop的安装对一个初学者来说是一个很头疼的事情 ...

  4. Python作业篇 day03

    ###一.有变量name = 'aleX leNb',完成如下的操作 name = 'aleX leNb' name1 = ' aleX leNb ' #1.移除name1 变量对应的值两边的空格 , ...

  5. 五、ibatis中#和$的区别和使用

    1.#和$两者含义不同#:会进行预编译,而且进行类型匹配:$:不进行数据类型匹配.示例:变量name的类型是string, 值是"张三"    $name$ = 张三    #na ...

  6. 一、什么是Velocity及简单示例

    1.velocity简介:    velocity是一个java模板引擎技术,任何人可以使用这种简单而又强有力的模板语言去获取java对象. 在使用Velocity进行web开发时,web开发人员和j ...

  7. 一道综合渗透题引发的updatexml()注入思考

    MYSQL数据库updatexml报错注入UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式, ...

  8. 对于strlen()函数的一点小疑问

    看csapp时候,看一下char*[8],以为char*也是一字节,但是指针是地址,64位编译器下是8字节,所以sizeof(B)是64字节 后来又看strlen(). #include"s ...

  9. 写给java web一年左右工作经验的人

      摘要 大学就开始学习web,磕磕绊绊一路走过来,当中得到过开源社区很多的帮助,总结了这些年来的技术积累,回馈给开源社区. ps:图片都是从网上盗...感谢原作者. ps:文字千真万确都是我自己写的 ...

  10. 初级入门 --- web GL绘制点

    " 万丈高楼平地起." 01基础知识 一.相关术语 图元 :WebGL 能够绘制的基本图形元素,包含三种:点.线段.三角形. 片元:可以理解为像素,像素着色阶段是在片元着色器中. ...