pytho数据分析模块如何用(umpy数据分析实例)
导语:Python 数据分析 NumPy 模块迭代数组nditer方法详解
考虑到实际应用场景中,数组往往不止一个维度,因此遍历数组中所有元素,使用while和for循环写起来很麻烦,本文将介绍NumPy自带的数组遍历方法nditer。
迭代器对象 nditer 在numpy 1.6中引入,提供了许多灵活的方法来系统地访问一个或多个数组的所有元素。其最基本的任务的可以完成对数组元素的访问。一个简单的例子,如下:
通过执行结果,我们可以看到迭代过程不是使用标准 C 或者 Fortran 顺序,选择的顺序是和数组内存布局一致的,这样做是为了提高访问效率,默认是行序优先(row-major order,或者说是 C-order)。
这反映了默认情况下只需访问每个元素,而无需考虑其特定顺序。我们可以通过迭代上述数组的转置来看到这一点,并与以 C 顺序访问数组转置的 copy 方式做对比,示例如下:
从上述例子可以看出,a 和 a.T 的遍历顺序相同,即他们在内存中的存储顺序是一样的。而 a.T.copy(order = 'C') 的遍历结果是不同的,因为它和前两种的存储方式是不一样的,默认是按行访问。
控制迭代顺序有时,无论内存中元素的布局如何,需要以特定的顺序访问数组元素。因此 nditer 对象提供 order 用于控制此迭代方面的参数。具有上述行为的默认值是order='K',就是上述的访问方式。对于C命令,可以用order='C'覆盖,对于Fortran命令,可以用order='F'覆盖。
for x in np.nditer(a, order='F'):order Fortran ,即是列序优先;for x in np.nditer(a.T, order='C'):order C,即是行序优先;示例如下
执行上述代码,输出结果为:
可以通过显式设置,来强制 nditer 对象使用某种顺序,如下:
执行上述代码,输出结果为:
修改数组值默认情况下, nditer将待迭代遍历的数组为只读对象(read-only)。如果在遍历数组的同时,需要对数组元素值进行修改,必须使用 op_flags=readwrite 或 op_flags=writeonly。
使用外部循环上面示例中是逐一访问数组中的每个元素,我们还可以一次访问某一个行或者某一列,这时候要用到flags参数 ,如 flags = external_loop,配合上控制顺序的参数order就可以按列输出或者按行顺序输出,如下:
如上,分别尝试了两种顺序的外部循环遍历数组n,F对应列优先顺序,输出的每一列组成一个数组。C对应行优先的顺,输出的所有元素组成一个数组。
flags参数,它可以接受下列值,参数描述:
c_index:可以跟踪 C 顺序的索引 。f_index:可以跟踪 Fortran 顺序的索引 。multi-index:每次迭代可以跟踪一种索引类型 。external_loop:给出的值是具有多个值的一维数组,而不是零维数组 。广播迭代如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 n 的维度为 2X2,数组 m 的维度为 2X1 ,则使用以下迭代器(数组 m 被广播到 n 的大小)。
本文内容由快快网络小思整理编辑!