NumPy 教程:数组迭代
发布时间:2023-03-21 14:19:33 所属栏目:教程 来源:
导读:NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式,迭代器最基本的任务的可以完成对数组元素的访问
使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代
In [1]: i
使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代
In [1]: i
|
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式,迭代器最基本的任务的可以完成对数组元素的访问 使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代 In [1]: import numpy as np In [2]: num = np.arange(6).reshape(2,3) In [3]: num Out[3]: array([[0,1,2],[3,4,5]]) In [4]: for x in np.nditer(num): ...: print(x,end=',') ...: 0,2,3,5, 以上实例不是使用标准 C 或者 Fortran 顺序,选择的顺序是和数组内存布局一致的,这样做是为了提升访问的效率,默认是行序优先(row-major order,或者说是 C-order) 这反映了默认情况下只需访问每个元素,而无需考虑其特定顺序。我们可以通过迭代上述数组的转置来看到这一点,并与以 C 顺序访问数组转置的 copy 方式做对比 In [5]: for x in np.nditer(num.T): ...: print(x,In [6]: for x in np.nditer(num.T.copy(order='C')): ...: print(x, 从上述例子可以看出,a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是 a.T.copy(order = ‘C’) 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问 控制遍历顺序 Fortran order:列序优先 for x in np.nditer(sum,order='F'): C order:行序优先 for x in np.nditer(sum.T,order='C') 原始数组 In [1]: import numpy as np In [2]: num = np.arange(0,60,5).reshape(3,4) In [3]: num Out[3]: array([[ 0,10,15],[20,25,30,35],[40,45,50,55]]) 原始数组转置 In [4]: t = num.T In [5]: t Out[5]: array([[ 0,20,40],[ 5,45],[10,50],[15,35,55]]) 以 C 风格顺序排序 In [6]: c = t.copy(order='C') In [7]: c Out[7]: array([[ 0,55]]) In [8]: for x in np.nditer(c): ...: print(x,40,15,55, 以 F 风格顺序排序 In [9]: f = t.copy(order='F') In [10]: f Out[10]: array([[ 0,55]]) In [11]: for x in np.nditer(f): ...: print(x,') ...: 0, 强制 nditer 对象使用某种顺序排序 原始数组 In [1]: import numpy as np In [2]: num = np.arange(0,55]]) 以 C 风格顺序排序 In [4]: for x in np.nditer(num,order='C'): ...: print(x, 以 F 风格顺序排序 In [5]: for x in np.nditer(num,order='F'): ...: print(x, 修改数组中元素的值 nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式 In [1]: import numpy as np In [2]: num = np.arange(0,55]]) In [4]: for x in np.nditer(num,op_flags=['readwrite']): ...: x[...] = 2 * x ...: In [5]: num Out[5]: array([[ 0,30],[ 40,70],[ 80,90,100,110]]) 使用外部循环 nditer类的构造器拥有flags参数,它可以接受下列值 c_index 可以跟踪 C 顺序的索引 f_index 可以跟踪 Fortran 顺序的索引 multi-index 每次迭代可以跟踪一种索引类型 external_loop 给出的值是具有多个值的一维数组,而不是零维数组 迭代器遍历对应于每列,并组合为一维数组 In [1]: import numpy as np In [2]: num = np.arange(0,flags=['external_loop'],') ...: [ 0 40 80],[10 50 90],[ 20 60 100],[ 30 70 110], 广播迭代 如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 a 的维度为 3X4,数组 b 的维度为 1X4 ,则使用以下迭代器(数组 b 被广播到 a 的大小) In [1]: import numpy as np In [2]: a = np.arange(0,4) In [3]: b = np.array([1,4],dtype=int) In [4]: a Out[4]: array([[ 0,55]]) In [5]: b Out[5]: array([1,4]) In [6]: for x,y in np.nditer([a,b]): ...: print('%d:%d' % (x,y),') ...: 0:1,5:2,10:3,15:4,20:1,25:2,30:3,35:4,40:1,45:2,50:3,55:4, (编辑:驾考网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
