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. sqlplus 登陆使用

    select * from dept; input order by dname;  追加文本命令  del  n  删除语句 celar buffer ; 清除缓冲区的命令 conn sys as ...

  2. 使用EA画流程图

    https://www.sparxsystems.com.au/enterprise_architect_user_guide/13.0/model_domains/flow_chart.html

  3. 蓝桥杯java 迷宫

    0101010100101100100101011001011010010000100010101000001000100000101010010000100000001001100110100101 ...

  4. Mybatis入门(四)配置别名(二)

    这一章我们练习一下Mybatis的别名,这大大的提高了我们的开发效率 类型别名(typeAliases) 类型别名是为 Java 类型设置一个短的名字. 它只和 XML 配置有关,作用在于用来减少类完 ...

  5. Windows7 wampServer3.0.6 Mutillidae2.7.12

    在Mac上访问虚拟机中的mutillidae,报403: By default, Mutillidae only allow access from localhost ***: Parallels ...

  6. mac flutter 创建过程及遇到的问题

    参考: 1.入门: 在macOS上搭建Flutter开发环境 系统要求 2.mac配置环境变量 1.打开终端 2.clone flutter 命令: git clone -b beta https:/ ...

  7. Helm 架构【转】

    在实践之前,我们先来看看 Helm 的架构. Helm 有两个重要的概念:chart 和 release. chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板.参数定 ...

  8. eclipse环境变量设置

    eclipse的运行需要java,但是当安装了多个版本的jdk后,eclipse可能就不能用了. 解决办法就是: #eclipse 文件夹下有eclipse.ini配置文件,在文件首行添加如下信息: ...

  9. 053、Java中使用for循环实现1~100的累加

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  10. POJ 3090 欧拉函数

    求一个平面内可见的点,其实就是坐标互质即可,很容易看出来或者证明 所以求对应的欧拉函数即可 #include <iostream> #include <cstdio> #inc ...