Lesson10——NumPy 迭代数组
NumPy 迭代数组
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。
迭代器最基本的任务的可以完成对数组元素的访问。
Example:使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代。
- a = np.arange(6).reshape(2,3)
- print('原始数组是')
- print(a)
- print('迭代输出元素')
- for x in np.nditer(a):
- print(x,end=' ')
- #输出结果
- 原始数组是
- [[0 1 2]
- [3 4 5]]
- 迭代输出元素
- 0 1 2 3 4 5
Example:
- a = np.arange(8).reshape(2,2,2)
- print('原始数组是')
- print(a)
- print('迭代输出元素')
- for x in np.nditer(a):
- print(x,end=' ')
- #输出结果
- 原始数组是
- [[[0 1]
- [2 3]]
- [[4 5]
- [6 7]]]
- 迭代输出元素
- 0 1 2 3 4 5 6 7
以上实例不是使用标准 C 或者 Fortran 顺序,选择的顺序是和数组内存布局一致的,这样做是为了提升访问的效率,默认是行序优先(row-major order,或者说是 C-order)。
这反映了默认情况下只需访问每个元素,而无需考虑其特定顺序。我们可以通过迭代上述数组的转置来看到这一点,并与以 C 顺序访问数组转置的 copy 方式做对比,如下实例:
Example:
- a = np.arange(6).reshape(2,3)
- for x in np.nditer(a.T):
- print(x,end=' ')
- print()
- print(a.T.copy(order ='C'))
- for x in np.nditer(a.T.copy(order ='C')):
- print(x,end=' ')
- #输出结果
- 0 1 2 3 4 5
- [[0 3]
- [1 4]
- [2 5]]
- 0 3 1 4 2 5
从上述例子可以看出,a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是 a.T.copy(order = 'C') 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问。
控制遍历顺序
for x in np.nditer(a, order='F'):
Fortran order,即是列序优先;for x in np.nditer(a.T, order='C'):
C order,即是行序优先;
Example:
- 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, end=", " )
- print ('\n')
- print ('以 F 风格顺序排序:')
- c = b.copy(order='F')
- print (c)
- for x in np.nditer(c):
- print (x, end=", " )
- #输出结果
- 原始数组是:
- [[ 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,
可以通过显式设置,来强制 nditer 对象使用某种顺序:
Example:
- 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, end=" " )
- print ('\n')
- print ('以 F 风格顺序排序:')
- for x in np.nditer(a, order = 'F'):
- print (x, end=" " )
- #输出结果
- 原始数组是:
- [[ 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。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式。
Example:
- x = np.arange(6).reshape((2,3))
- print('The original array is')
- print(x)
- for tmp in np.nditer(x,op_flags =['readwrite']):
- tmp[...] = 1
- print("The modified array is")
- print(x)
- #output result
- """
- The original array is
- [[0 1 2]
- [3 4 5]]
- The modified array is
- [[1 1 1]
- [1 1 1]]
- """
使用外部循环
nditer 类的构造器拥有 flags 参数,它可以接受下列值:
参数 | 描述 |
---|---|
c_index |
可以跟踪 C 顺序的索引 |
f_index |
可以跟踪 Fortran 顺序的索引 |
multi_index |
每次迭代可以跟踪一种索引类型 |
external_loop |
给出的值是具有多个值的一维数组,而不是零维数组 |
在下面的实例中,迭代器遍历对应于每列,并组合为一维数组。
Example:
- x = np.arange(9).reshape((3,3))
- print("The original array is ")
- print(x)
- print('The modified array is ')
- for x in np.nditer(x,flags=['external_loop'],order='F'):
- print(x)
- #output result
- """
- The original array is
- [[0 1 2]
- [3 4 5]
- [6 7 8]]
- The modified array is
- [0 3 6]
- [1 4 7]
- [2 5 8]
- """
广播迭代
如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 $ a $ 的维度为 $3X4$,数组 $b$ 的维度为 $1X4$ ,则使用以下迭代器(数组 $b$ 被广播到 $a$ 的大小)。
Example:
- a = np.arange(0,60,5)
- a = a.reshape(3,4)
- print ('First array:')
- print (a)
- print ('\n')
- print ('Second array:')
- b = np.array([1, 2, 3, 4], dtype = int)
- print (b)
- print ('\n')
- print ('The modified array :')
- for x,y in np.nditer([a,b]):
- print ("%d:%d" % (x,y), end=", " )
- #output result
- """
- First array:
- [[ 0 5 10 15]
- [20 25 30 35]
- [40 45 50 55]]
- Second array:
- [1 2 3 4]
- The modified array :
- 0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
- """
Lesson10——NumPy 迭代数组的更多相关文章
- NumPy 迭代数组
NumPy 迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用 arange() ...
- NumPy迭代数组
numpy.nditer是NumPy的一个迭代器对象,提供能够灵活的访问一个或者多个属猪元素的方式. # 迭代 z=np.arange(6).reshape(3,2) for x in np.ndit ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 迭代数组
import numpy as np a = np.arange(6).reshape(2,3) print ('原始数组是:') print (a) print ('\n') print ('迭代输 ...
- 找出numpy array数组的最值及其索引
在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...
- python 工具 字符串转numpy浮点数组
不同的数字之间使用 空格“ ”,“$”,"*"等隔开,支持带小数点的字符串NumArray=str2num(LineString,comment='#')将字符串中的所有非Doub ...
- Numpy | 04 数组属性
NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推. 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions).比如说,二 ...
- numpy使用数组进行数据处理
numpy使用数组进行数据处理 meshgrid函数 理解: 二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标? 显而易见是6个: (1,7)(2,7) ...
- python数据分析 Numpy基础 数组和矢量计算
NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...
- Numpy中数组的乘法
Numpy中数组的乘法 按照两个相乘数组A和B的维度不同,分为以下乘法: 数字与一维/二维数组相乘: 一维数组与一维数组相乘: 二维数组与一维数组相乘: 二维数组与二维数组相乘: numpy有以下乘法 ...
随机推荐
- html 基础 vscode的常用快捷键
1.ctrl+/ //注释代码 2.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 3.移动当前行,向上alt+up(方向键↑) ...
- CentOS8.2安装docker
1:安装docker前准备docker配置仓库(安装yum-utils是提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2 ...
- Pytest_在jenkins中使用allure报告(13)
一.安装allure插件 点击jenkins管理-->插件管理 点击Available,在搜索框中输入allure并安装 二.配置构建命令 三.构建配置allure插件 点击构建后置操作 pat ...
- Pytest_参数化(10)
pytest参数化有两种方式: mark的parametrize标记:@pytest.mark.parametrize(变量名,变量值),其中变量值类型为列表.元组或其它可迭代对象. fixture的 ...
- Selenium_获取界面handle、title和url(7)
from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...
- spring boot 热部署 实现 前端部分热更新 详细操作
1.前言 在以前的随笔[https://www.cnblogs.com/c2g5201314/p/12275243.html] 里面已经讲解过了 idea 如何在 springMVC 项目 实现 前端 ...
- Go语言系列之标准库ioutil
ioutil标准库中提供了一些常用.方便的IO操作函数 一.相关方法 func ReadAll(r io.Reader) ([]byte, error) func ReadDir(dirname st ...
- Sentry 开发者贡献指南 - Django Rest Framework(Serializers)
Serializer 用于获取复杂的 python 模型并将它们转换为 json.序列化程序还可用于在验证传入数据后将 json 反序列化回 Python 模型. 在 Sentry,我们有两种不同类型 ...
- Linux下Redis 6.2.6安装和部署详细图文步骤
Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的 ...
- ClassCastException: java.util.Date cannot be cast to java.sql.Date
解决办法 /** * 单个方法,作用,根据输入的day:yyyy-mm-dd格式的字符日期,将数据库中的该天所有数据更新为0 * 0表示假期 * @param day * @throws SQLExc ...