NumPy - 数组上的迭代

NumPy 包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。 数组的每个元素可使用 Python 的标准Iterator接口来访问。

让我们使用arange()函数创建一个 3X4 数组,并使用nditer对它进行迭代。

示例 1

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始数组是:'
print a print '\n'
print '修改后的数组是:'
for x in np.nditer(a):
print x,
Python

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 修改后的数组是:
0 5 10 15 20 25 30 35 40 45 50 55
Python

示例 2

迭代的顺序匹配数组的内容布局,而不考虑特定的排序。 这可以通过迭代上述数组的转置来看到。

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始数组是:'
print a
print '\n'
print '原始数组的转置是:'
b = a.T
print b
print '\n'
print '修改后的数组是:'
for x in np.nditer(b):
print x,
Python

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 原始数组的转置是:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]] 修改后的数组是:
0 5 10 15 20 25 30 35 40 45 50 55
Python

迭代顺序

如果相同元素使用 F 风格顺序存储,则迭代器选择以更有效的方式对数组进行迭代。

示例 1

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始数组是:'
print a print '\n'
print '原始数组的转置是:'
b = a.T
print b
print '\n'
print '以 C 风格顺序排序:'
c = b.copy(order='C')
print c for x in np.nditer(c):
print x,
print '\n'
print '以 F 风格顺序排序:'
c = b.copy(order='F')
print c
for x in np.nditer(c):
print x,
Python

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 原始数组的转置是:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]] 以 C 风格顺序排序:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0 20 40 5 25 45 10 30 50 15 35 55 以 F 风格顺序排序:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0 5 10 15 20 25 30 35 40 45 50 55

示例 2

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

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始数组是:'
print a
print '\n'
print '以 C 风格顺序排序:'
for x in np.nditer(a, order = 'C'):
print x,
print '\n'
print '以 F 风格顺序排序:'
for x in np.nditer(a, order = 'F'):
print x,
Python

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 以 C 风格顺序排序:
0 5 10 15 20 25 30 35 40 45 50 55 以 F 风格顺序排序:
0 20 40 5 25 45 10 30 50 15 35 55

修改数组的值

nditer对象有另一个可选参数op_flags。 其默认值为只读,但可以设置为读写或只写模式。 这将允许使用此迭代器修改数组元素。

示例

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

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 修改后的数组是:
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]

外部循环

nditer类的构造器拥有flags参数,它可以接受下列值:

序号 参数及描述
1. c_index 可以跟踪 C 顺序的索引
2. f_index 可以跟踪 Fortran 顺序的索引
3. multi-index 每次迭代可以跟踪一种索引类型
4. external_loop 给出的值是具有多个值的一维数组,而不是零维数组

示例

在下面的示例中,迭代器遍历对应于每列的一维数组。

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始数组是:'
print a
print '\n'
print '修改后的数组是:'
for x in np.nditer(a, flags = ['external_loop'], order = 'F'):
print x,

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 修改后的数组是:
[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]

广播迭代

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

示例

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

输出如下:

第一个数组:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]] 第二个数组:
[1 2 3 4] 修改后的数组是:
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 | 12 数组操作

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

  2. NumPy:数组计算

    一.MumPy:数组计算 1.NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础.2.NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环 ...

  3. JavaScript 基础数组循环和迭代的几种方法

    JavaScript 数组循环和迭代   (之前一直没怎么注意数组循环,今天做一道题时,用到forEach循环发现它并没有按照我想象的样子执行,总结一下数组循环) 一.第一种方法就是for()循环   ...

  4. Numpy | 04 数组属性

    NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推. 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions).比如说,二 ...

  5. 利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

    4.2 通用函数:快速的元素级数组函数 通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数. 1)一元(unary)ufunc,如,sqrt和exp函数 2)二元(unary) ...

  6. 关于NumPy中数组轴的理解

    参考原文链接(英文版):https://www.sharpsightlabs.com/blog/numpy-axes-explained/:中文版:https://www.jianshu.com/p/ ...

  7. numpy使用数组进行数据处理

    numpy使用数组进行数据处理 meshgrid函数 理解: 二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标? 显而易见是6个: (1,7)(2,7) ...

  8. python数据分析 Numpy基础 数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  9. 找出numpy array数组的最值及其索引

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...

随机推荐

  1. Top15的golang学习资源网站

    We decided to ask the Go expert and CTO at QArea’s, Maksim Kuharenko, to share his personal list of ...

  2. amazonservices api 抽象类 Class Abstraction

    http://php.net/manual/zh/language.oop5.abstract.php MWSOrdersPHPClientLibrary-2013-09-01._V533357711 ...

  3. Java 之单例设计模式

    设计模式: 对问题行之有效的解决方式, 其实它是一种思想. 单例设计模式 解决的问题:就是可以保证一个类在内存中的对象唯一性. 即单个实例. 比如对于A 和 B 两个程序使用同一个配置信息对象时, A ...

  4. XML 之快速入门

    XML 简介 - XML, 即可扩展标记语言(eXtensible Markup Language), 是一种标记语言. - 标记型语言: 使用标签进行操作 - 可扩展: XML 的标签可以自定义 - ...

  5. ubuntu14 编译安装(升级)g++

    编译安装(升级)g++ ubuntu14自带的g++为4.8.4,不支持c++11.现要将g++升至5.2.0 1.下载安装: 参考https://www.cppfans.org/1719.html ...

  6. 利用VMware克隆 windows 虚拟机需要注意的事项

    利用VMware克隆windows虚拟机需要注意的事项--克隆虚拟机 --powershell 在域服务器使用,查看所有的sid dsquery computer|dsget computer -dn ...

  7. android6.0获取通讯录权限

    android6.0中,获取通讯录的权限是    <uses-permission android:name="android.permission.GET_ACCOUNTS" ...

  8. java 自制Tomcat Andorid IOS 端 证书

    java 自制证书 最近做项目用到Https 需要自制各种证书,Tomcat 用的JKS 格式, Andorid 端使用 BKS 格式, IOS 端使用 P12格式正式, 以及各种证书格式之间的转换. ...

  9. php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理

    php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理 Joe PHP 2012-01-18 定时任务对于php来说一直都是很多朋友的一个难题,但却很多地方都遇到了.比如说:游戏 ...

  10. 看github上有18万star的第一开源项目如何教你学前端编程的

    作为 Github | star 第一开源项目,已经超过18万 star:比之前最火的bootstrap的10万star还要多出8w,freeCodeCamp 越来越受关注,建站两年时间不到已经近40 ...