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设置为readwrite或write。

示例

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. TCP/IP,三次握手四次挥手,TCP/UDP , HTTP/HTTPS

    internet:通用名词,由多个计算机网络组成的网络,网络间的通信协议是任意的 Internet:专用名词,当前全球最大的开放计算机网络,采用TCP/IP协议族作为通信的规则.www万维网是广泛应用 ...

  2. map的查询和修改方法

    1:map查询的方法 package com.cn.util; import java.util.ArrayList; import java.util.HashMap; import java.ut ...

  3. JDBC--调用函数&存错过程

    1.通过Connection对象的prepareCall()方法创建CallableStatement对象的实例,在使用prepareCall()方法时需传入一个String类型的字符串,该字符串用于 ...

  4. Day2-J-逃离迷宫-HDU-1728

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...

  5. 如何使用Docker部署PHP开发环境

    本文主要介绍了如何使用Docker构建PHP的开发环境,文中作者也探讨了构建基于Docker的开发环境应该使用单容器还是多容器,各有什么利弊.推荐PHP开发者阅读.希望对大家有所帮助. 环境部署一直是 ...

  6. linux--redis学习

    redis redis在linux的安装 1.redis安装方式 yum安装(提前配置好yum源) yum install redis -y # 源代码编译安装 rpm包手动安装 2.编译安装redi ...

  7. WCF 学习

    https://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html using System.ServiceModel; name ...

  8. mysqlworkbench导入sql文件

    直接给上神秘地址怕自己以后忘记:https://blog.csdn.net/u010801439/article/details/78762387

  9. Jackson自定义反序列化

    // 设置jackson时间反系列化格式 SimpleModule module = new SimpleModule(); module.addDeserializer(Date.class, ne ...

  10. swoole之建立 websocket server

    一.代码部分 <?php /** * 为什么用WebSocket? * HTTP的通信只能由客户端发起 * * WebSocket 协议是基于TCP的一种新的网络协议.实现了浏览器与服务器全双工 ...