一、单个数组的遍历:numpy.nditer 的使用 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。一般情况下的使用方式如下:for x in np.nditer(data_in, order=''),可以遍历
一、单个数组的遍历:numpy.nditer 的使用
迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。一般情况下的使用方式如下:for x in np.nditer(data_in, order=''),可以遍历nparray中的所有数据,举例如下:
a = np.arange(12).reshape(3,4) for x in np.nditer(a): print(x,end=',') # 0,1,2,3,4,5,6,7,8,9,10,11,格式:np.nditer(data_in, order='',op_flags =[],flags=[])
参数解释如下:
参数 解释 data_in nparray 类型的数组 order 控制遍历的顺序,可选值为:F 列优先/C 行优先, 默认为C op_flags 控制遍历出元素的读写权限,常用:<br>op_flags=['read-only'] 只读;<br>op_flags=['readwrite'] 可读可写 flags 该参数通常使用flags = ['external_loop'],可以将二维数组变化为一维数组输出,详细参考下面例子1.1 参数:order
通过参数 order='F' or order='C' 可以通过改变遍历的顺序;举例如下:
for x in np.nditer(a, order='F'): # Fortran order,即是列序优先; for x in np.nditer(a.T, order='C'): # C order,即是行序优先;
for x in np.nditer(a,order='F'): print(x,end=',') # 0,4,8,1,5,9,2,6,10,3,7,11, for x in np.nditer(a,order='C'): print(x,end=',') # 0,1,2,3,4,5,6,7,8,9,10,11,1.2 参数:op_flags
默认情况下,nditer 对nparray进行遍历时,遍历出的元素为只读对象(read-only),若我们需要修改其中的值,需要设置:op_flags=['readwrite']
a = np.arange(12).reshape(3,4) for x in np.nditer(a,op_flags=['readwrite']): x[...] = 2*x print(a) # [[ 0 2 4 6] # [ 8 10 12 14] # [16 18 20 22]]1.3 参数:flags
尝试用的参数设置为:flags = ['external_loop'] ,其余的设置不常用,就不列举了;当设置flags = ['external_loop'] 后,可以实现对二维数组的行或者列的输出,在今后的写代码过程中,给大家带来便利;举例如下:
参数 解释 c_index 可以跟踪 C 顺序的索引, 用来返回索引值 f_index 可以跟踪 Fortran 顺序的索引,用来返回索引值 external_loop 给出的值是具有多个值的一维数组,而不是零维数组举例:
# 返回索引值举例 a = np.arange(12).reshape(3,4) for x in np.nditer(a,flags=['f_index'],order='F'): print(x,end=',') # 0,4,8,1,5,9,2,6,10,3,7,11, for x in np.nditer(a,flags=['f_index'],order='C'): print(x,end=',') # 0,1,2,3,4,5,6,7,8,9,10,11, # 返回列方向的多个一维数组 a = np.arange(12).reshape(3,4) for x in np.nditer(a,flags=['external_loop'],order='F'): print(x) # [0 4 8] # [1 5 9] # [ 2 6 10] # [ 3 7 11]二、多个数组的遍历
2.1 多个数组Shape相同时
当数组Shape相同时,可以直接使用np.nditer(), 举例如下:
a = np.arange(12).reshape(3,4) b = np.ones(12).reshape(3,4) for i,j in np.nditer([a,b]): print(i,"-->",int(j)) # 输出如下: # 0 --> 1 # 1 --> 1 # 2 --> 1 # 3 --> 1 # 4 --> 1 # 5 --> 1 # 6 --> 1 # 7 --> 1 # 8 --> 1 # 9 --> 1 # 10 --> 1 # 11 --> 12.2 多个数组Shape不同时
当数组Shape不同时,需要满足广播规则,才可以使用广播遍历,广播规则请参考:请添加链接描述 举例如下:
a = np.arange(12).reshape(3,4) b = np.arange(4) for i,j in np.nditer([a,b]): print(i,"-->",j) # 输出如下: # 0 --> 0 # 1 --> 1 # 2 --> 2 # 3 --> 3 # 4 --> 0 # 5 --> 1 # 6 --> 2 # 7 --> 3 # 8 --> 0 # 9 --> 1 # 10 --> 2 # 11 --> 3